将 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(作为单行)