我有一个与此类似的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()
或拼接机制将列组合成列表?
答案 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())