如何解决每列中有多个值的 DataFrame如何在主标题下对它们进行单热编码?
我有一个 DataFrame,每列中有一个变量列表。我不知道如何对每列中的数据进行单热编码。
In:
lst = [['Red,Blue,Yellow','Blue,Green,'Green,Red,Blue'],['Yellow,Blue',Green','Yellow,Red'],'Red,Yellow,Red']]
df = pd.DataFrame(lst,columns =['A','B','C'],dtype = float)
Out:
A B C
Ella Red,Yellow Blue,Yellow Green,Blue
Mike Yellow,Blue Blue,Green Yellow,Red
Dave Yellow,Green Red,Blue Green,Red
我希望使用多层列标题来创建它,如下所示:
A B C
Red Blue Green Yellow Red Blue Green Yellow ....
Ella 1 1 0 1 0 1 1 1 ....
Mike 1 1 0 1 1 1 1 0 ....
Dave 1 0 1 1 1 1 0 1 ....
我非常感谢您的指导,因为我已经坚持了一段时间!
解决方法
这里有一个方法:
df = df.stack().str.get_dummies(sep=',')
df.columns = df.columns.str.strip()
df = df.stack().groupby(level=[0,1,2]).sum().unstack(level=[1,2])
,
有一个很好的答案here。在您的情况下,您必须将相同的内容应用于不同的列,因此类似于(可以进一步优化):
import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer
import numpy as np
lst = [['Red,Blue,Yellow','Blue,Green,'Green,Red,Blue'],['Yellow,Blue',Green','Yellow,Red'],'Red,Yellow,Red']]
df = pd.DataFrame(lst,columns =['A','B','C'],dtype = float)
mlb = {}
res = {}
for column in df.columns:
mlb[column] = MultiLabelBinarizer()
res[column] = pd.DataFrame(mlb[column].fit_transform(df[column].apply(lambda x: [j.strip() for j in x.split(",")])),columns=mlb[column].classes_,index=df[column].index)
arrays = [np.concatenate(([np.array([column]*len(mlb[column].classes_)) for column in df.columns])),np.concatenate(([mlb[column].classes_ for column in df.columns]))]
df_end = pd.DataFrame(columns = arrays,index = [0,2])
for column in df.columns:
df_end[column] = res[column]
df_end
A B C
Blue Green Red Yellow Blue Green Red Yellow Blue Green Red Yellow
0 1 0 1 1 1 1 0 1 1 1 1 0
1 1 0 1 1 1 1 1 0 1 0 1 1
2 0 1 1 1 1 0 1 1 1 1 1 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。