使用pandas将字符串列表转换为虚拟变量

时间:2017-05-12 20:14:54

标签: python pandas

如果我有以下熊猫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'])执行此操作,但当tagsList时,这不起作用。

3 个答案:

答案 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