【问题标题】:Save one-hot-encoded features into Pandas DataFrame the fastest way以最快的方式将 one-hot-encoded 特征保存到 Pandas DataFrame 中
【发布时间】:2016-10-08 11:16:11
【问题描述】:

我有一个包含我所有功能和标签的 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

【问题讨论】:

  • 试试df['mycol'] = pd.factorize(df['mycol'])[0]

标签: python pandas machine-learning scikit-learn


【解决方案1】:

你可以使用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.]])

【讨论】:

  • get_dummies() 与我的解决方案相比,速度非常快,并且还帮助我在代码中执行下一步(将每个元素保存到新列中)。感谢您的帮助!
  • 还可以考虑使用 OneHotEncoder,因为您可以在 scikit-learn 管道中使用它,因此无需额外的合并步骤。
猜你喜欢
  • 2021-11-12
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2021-05-01
  • 2016-03-02
  • 1970-01-01
  • 2017-04-23
  • 2019-10-09
相关资源
最近更新 更多