将 Pandas Dataframe 列转换为一个热标签

Converting a Pandas Dataframe column into one hot labels

我有一个与此类似的 pandas 数据框:

  Col1   ABC
0  XYZ    A
1  XYZ    B
2  XYZ    C

通过在 ABC 列上使用 pandas get_dummies() 函数,我可以得到:

  Col1   A   B   C
0  XYZ   1   0   0
1  XYZ   0   1   0
2  XYZ   0   0   1

虽然我需要这样的东西,但 ABC 列具有 list / array 数据类型:

  Col1    ABC
0  XYZ    [1,0,0]
1  XYZ    [0,1,0]
2  XYZ    [0,0,1]

我尝试使用 get_dummies 函数,然后将所有列合并到我想要的列中。我找到了很多解释如何将多个列组合为字符串的答案,如下所示:Combine two columns of text in dataframe in pandas/python。但我想不出将它们组合成列表的方法。

这个问题介绍了使用 sklearn 的 OneHotEncoder 的想法,但我无法让它工作。

还有一件事:我遇到的所有答案都有解决方案,其中在组合列名时必须手动键入它们。有没有办法使用Dataframe.iloc()或拼接机制将列组合成列表?

如果你有这样的pd.DataFrame:

>>> df
  Col1  A  B  C
0  XYZ  1  0  0
1  XYZ  0  1  0
2  XYZ  0  0  1

你总是可以这样做:

>>> df.apply(lambda s: list(s[1:]), axis=1)
0    [1, 0, 0]
1    [0, 1, 0]
2    [0, 0, 1]
dtype: object

请注意,这实际上是行上的 for 循环。注意,列 not 具有 list 数据类型,它们必须是 object,这将使您的数据帧操作无法利用速度numpy.

的好处

这里是一个使用sklearn.preprocessing.LabelBinarizer的例子:

In [361]: from sklearn.preprocessing import LabelBinarizer

In [362]: lb = LabelBinarizer()

In [363]: df['new'] = lb.fit_transform(df['ABC']).tolist()

In [364]: df
Out[364]:
  Col1 ABC        new
0  XYZ   A  [1, 0, 0]
1  XYZ   B  [0, 1, 0]
2  XYZ   C  [0, 0, 1]

Pandas备选方案:

In [370]: df['new'] = df['ABC'].str.get_dummies().values.tolist()

In [371]: df
Out[371]:
  Col1 ABC        new
0  XYZ   A  [1, 0, 0]
1  XYZ   B  [0, 1, 0]
2  XYZ   C  [0, 0, 1]

你可以直接使用 tolist():

df['ABC'] = pd.get_dummies(df.ABC).values.tolist()

  Col1        ABC
0  XYZ  [1, 0, 0]
1  XYZ  [0, 1, 0]
2  XYZ  [0, 0, 1]

如果你有一个数据框 df 和分类列 ABC 那么你可以用来创建一个新的单热向量列

df['new_column'] = list(pandas.get_dummies(df['AB]).get_values())