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

时间:2017-11-05 22:35:51

标签: python pandas sklearn-pandas one-hot-encoding

我有一个与此类似的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的想法,但我无法让它工作。 How do I one-hot encode one column of a pandas dataframe?

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

4 个答案:

答案 0 :(得分:5)

以下是使用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]

熊猫替代品:

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]

答案 1 :(得分:2)

如果您有这样的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循环。请注意,的列具有list数据类型,它们必须为object,这将使您的数据框操作无法利用{的速度优势{ {1}}。

答案 2 :(得分:2)

您可以使用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]

答案 3 :(得分:0)

如果您的数据框df带有分类列ABC,那么您可以使用创建一个新的单热矢量列

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