如果我有以下熊猫DataFrame
:
pd.DataFrame(columns=['name', 'tags'], data=[
['Rob', ['a', 'c']],
['Erica', ['b', 'c']]
])
表:
Name tags
Rob ['a', 'c']
Erica ['b', 'c']
我如何将其转换为:
Name tags_a tags_b tags_c
Rob 1 0 1
Erica 0 1 1
如果每行只有1个标记,我可以使用pd.get_dummies(df, columns=['tags'])
执行此操作,但当tags
为List
时,这不起作用。
答案 0 :(得分:3)
str.get_dummies
df.tags.str.join('|').str.get_dummies().add_prefix('tags_')
tags_a tags_b tags_c
0 1 0 1
1 0 1 1
包含join
df[['name']].join(df.tags.str.join('|').str.get_dummies().add_prefix('tags_'))
name tags_a tags_b tags_c
0 Rob 1 0 1
1 Erica 0 1 1
答案 1 :(得分:3)
# reorganize data
df = pd.get_dummies(df.set_index('name').tags
.apply(pd.Series)
.stack()
).unstack()
# remove multilevel column and collapse counts per name
df.columns = df.columns.droplevel(1)
df.groupby(by=df.columns, axis=1).sum().add_prefix('tags_')
tags_a tags_b tags_c
name
Rob 1 0 1
Erica 0 1 1
答案 2 :(得分:1)
#use apply to transform tags to separate tags
df.apply(lambda x: [x['name']] + np.in1d(('a','b','c'),x.tags).astype(int).tolist() ,axis=1).apply(pd.Series)
#rename columns
df2.columns=['name', 'tags_a', 'tags_b', 'tags_c']
df2
Out[505]:
name tags_a tags_b tags_c
0 Rob 1 0 1
1 Erica 0 1 1