2017-02-11 223 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