2017-05-12 54 views
2

,如果我有以下的熊貓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

+1

這裏是一個黑客http://stackoverflow.com/a/40938927/2285236 – ayhan

回答

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
#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 
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