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

Posted

技术标签:

【中文标题】将 Pandas Dataframe 列转换为一个热标签【英文标题】:Converting a Pandas Dataframe column into one hot labels 【发布时间】:2018-04-18 01:14:47 【问题描述】:

我有一个类似这样的熊猫数据框:

  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()或拼接机制将列组合成一个列表?

【问题讨论】:

"ABC 列有一个列表/数组数据类型:"为什么? Combine columns in a Pandas DataFrame to a column of lists in a DataFrame的可能重复 【参考方案1】:

这里是一个使用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]

【讨论】:

获得列表列后,我可以使用 df['new'].apply(lambda x: np.array(x)) 将列表转换为数组。有没有直接获取数组的方法? @Nir_J,我不知道如何将 Numpy 2D 数组直接分配给单个 Pandas 列。 Pandas 会认为我们分配了多个列...实际上这就是我使用 .tolist() 的原因【参考方案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】:

如果你有这样的 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,这将使您的数据帧操作无法利用numpy 的速度优势。

【讨论】:

感谢您指出列表的缺点。我希望能够仅使用那一列作为标签来训练模型。此解决方案能否利用 numpy 的速度优势? @Nir_J 没有。我不确定sklearn 中的模型是否会接受list 对象的列。【参考方案4】:

如果您有一个带有分类列 ABC 的数据框 df,那么您可以使用它来创建一个新的 one-hot 向量列

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

【讨论】:

以上是关于将 Pandas Dataframe 列转换为一个热标签的主要内容,如果未能解决你的问题,请参考以下文章

如何将可变长度列表的 Pandas DataFrame 列(或系列)转换为固定宽度的 DataFrame [重复]

将 Pandas 系列的二维 numpy 数组转换为一维 numpy 数组列的 Pandas DataFrame

将 Numpy 数组按列转换为 Pandas DataFrame(作为单行)

将 Pandas DataFrame 的行转换为列标题,

Pandas DataFrame 将 jsons 列列表转换为信息行,每个“id”

无法将Pandas Dataframe列转换为float