我有DataFrame的列和列表中的数据,我想将相关数据放到相关列中

假设您给出了所有项目的列表,并且分别拥有数据列表并且列表的形状未固定,则其中可能包含任意数量的项目,您希望从中创建数据框,并且必须将其放入在写列 例如

columns = ['shirt','shoe','tie','hat']
data = [['hat','tie'],['shoe','shirt'],['tie','shirt',]]
# and from this I wants to create a dummy variable like this 
  shirt  shoe  tie  hat
0   0     0     1    1
1   1     1     1    0
2   1     0     1    0

hanhjj 回答:我有DataFrame的列和列表中的数据,我想将相关数据放到相关列中

如果要用01填充的指标列仅将MultiLabelBinarizerDataFrame.reindex一起使用,如果要按列表更改列的顺序,并且如果可能不存在某些值,则仅添加0列:

columns = ['shirt','shoe','tie','hat']
data = [['hat','tie'],['shoe','shirt'],['tie','shirt',]]

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = (pd.DataFrame(mlb.fit_transform(data),columns=mlb.classes_)
        .reindex(columns,axis=1,fill_value=0))
print (df)
   shirt  shoe  tie  hat
0      0     0    1    1
1      1     1    1    0
2      1     0    1    0

Series.str.get_dummies

df = pd.Series(data).str.join('|').str.get_dummies().reindex(columns,fill_value=0)
print (df)
   shirt  shoe  tie  hat
0      0     0    1    1
1      1     1    1    0
2      1     0    1    0
,

这是使用collections.Counter的一种方法。

例如:

from collections import Counter
columns = ['shirt','shirt']]

data = map(Counter,data)
#df = pd.DataFrame(data,columns=columns)
df = pd.DataFrame(data,columns=columns).fillna(0).astype(int)

print(df)

输出:

   shirt  shoe  tie  hat
0      0     0    1    1
1      1     1    1    0
2      1     0    1    0
,

您可以尝试将数据转换为数据框:

data = [['hat',]]

df = pd.DataFrame(data)
df

     0       1      2
0   hat     tie     None
1   shoe    tie     shirt
2   tie    shirt    None

他们使用:

pd.get_dummies(df.stack()).groupby(level=0).agg('sum')

   hat  shirt   shoe    tie
0   1   0       0       1
1   0   1       1       1
2   0   1       0       1

说明:

df.stack()返回一个MultiIndex系列:

0  0      hat
   1      tie
1  0     shoe
   1      tie
   2    shirt
2  0      tie
   1    shirt
dtype: object

如果获得该系列的虚拟值,则会得到:

       hat  shirt    shoe   tie
0   0   1   0           0       0
    1   0   0           0       1
1   0   0   0           1       0
    1   0   0           0       1
    2   0   1           0       0
2   0   0   0           0       1
    1   0   1           0       0

然后,您只需要按索引分组并使用sum合并它们(因为我们知道get_dummies之后将只有一或零):

df = pd.get_dummies(df.stack()).groupby(level=0).agg('sum')
本文链接:https://www.f2er.com/2901441.html

大家都在问