早期的pd.get_dummies()方法是将数据变成0/1的,这时候没什么问题。

但现在更新后,默认生成的数据是bool值,如下:

这会导致什么问题呢,比如说我想将这个dataFrame的类型转成torch.float32,会出错,如下:

代码: 

train_features = torch.tensor(all_features[:n_train].values, dtype=torch.float32)

报错:

TypeError: can't convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, int32, int16, int8, uint64, uint32, uint16, uint8, and bool.

 但是我的dataFrame是只有float类型的列跟bool类型的列,为什么转不了我也不太清楚,我猜测是转的时候将True跟False识别成字符串了……不过,解决就是了。

将dataFrame的True/False转成0/1:

我想过采用

all_features=all_features.apply(
    lambda x:  1 if x==True else 0 if x==False else x
)

报错

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

很容易理解,apply处理的是整列,而我写的lambda针对的是某个值,不匹配,所以报错才会说ambiguous(对数据的处理模糊,不知道要处理谁)

改成用map,针对每个元素进行处理:

all_features=all_features.map(
    lambda x:  1 if x==True else 0 if x==False else x
)

成功:

看了别人的回答,有更简便的办法,就是get_demmies时设置要转的数据类型,dtype=np.int8

all_features = pd.get_dummies(all_features, dummy_na=True,dtype=np.int8)

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐