将 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())
我有一个与此类似的 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())