2017-02-11 224 views
2

我有一个系列是这个样子:需要转一个大熊猫据帧

 col1   id 
0  a   10 
1  b   20 
2  c   30 
3  b   10 
4  d   10 
5  a   30 
6  e   40 

我所需的输出是这样的:

a b c d e 
10 1 1 0 1 0 
20 0 1 0 0 0 
30 1 0 1 0 0 
40 0 0 0 0 1 

我得到这个代码:

import pandas as pd 

df['dummies'] = 1 
df_ind.pivot(index='id', columns='col1', values='dummies') 

我收到一个错误:

137 
    138   if mask.sum() < len(self.index): 
--> 139    raise ValueError('Index contains duplicate entries, ' 
    140        'cannot reshape') 
    141 

ValueError: Index contains duplicate entries, cannot reshape 

存在重复的id,因为col1中的多个值可归因于单个id。

我怎样才能达到理想的输出?

谢谢!

回答

9

你可以使用pd.crosstab

In [329]: pd.crosstab(df.id, df.col1) 
Out[329]: 
col1 a b c d e 
id 
10 1 1 0 1 0 
20 0 1 0 0 0 
30 1 0 1 0 0 
40 0 0 0 0 1 

或者,使用pd.pivot_table

In [336]: df.pivot_table(index='id', columns='col1', aggfunc=len, fill_value=0) 
Out[336]: 
col1 a b c d e 
id 
10 1 1 0 1 0 
20 0 1 0 0 0 
30 1 0 1 0 0 
40 0 0 0 0 1 

或者,用groupbyunstack

In [339]: df.groupby(['id', 'col1']).size().unstack(fill_value=0) 
Out[339]: 
col1 a b c d e 
id 
10 1 1 0 1 0 
20 0 1 0 0 0 
30 1 0 1 0 0 
40 0 0 0 0 1