以最快的方式将单热编码功能保存到Pandas DataFrame中

时间:2016-06-08 09:16:25

标签: python pandas machine-learning scikit-learn

我有一个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

1 个答案:

答案 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.]])