我有一个Pandas DataFrame,包含我的所有功能和标签。我的一个功能是分类,需要进行一次热编码。
该功能是一个整数,只能包含0 to 4
要将这些数组保存回我的DataFrame,请使用以下代码
# enc is my OneHotEncoder object
df['mycol'] = df['mycol'].map(lambda x: enc.transform(x).toarray())
我的DataFrame有超过100万行,所以上面的代码需要一段时间。是否有更快的方法将数组分配给DataFrame单元格?因为我只有5个类别,所以我不需要将transform()
函数调用100万次。
我已经尝试了类似
的内容num_categories = 5
i = 0
while (i<num_categories):
df.loc[df['mycol'] == i, 'mycol'] = enc.transform(i).toarray()
i += 1
产生此错误
ValueError: Must have equal len keys and value when setting with an ndarray
答案 0 :(得分:3)
您可以使用pd.get_dummies:
>>> s
0 a
1 b
2 c
3 a
dtype: object
>>> pd.get_dummies(s)
a b c
0 1 0 0
1 0 1 0
2 0 0 1
3 1 0 0
可替换地:
>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> a = np.array([1, 1, 3, 2, 2]).reshape(-1, 1)
>>> a
array([[1],
[1],
[3],
[2],
[2]]
>>> one_hot = enc.fit_transform(a)
>>> one_hot.toarray()
array([[ 1., 0., 0.],
[ 1., 0., 0.],
[ 0., 0., 1.],
[ 0., 1., 0.],
[ 0., 1., 0.]])