2017-02-11 2 views
2

У меня есть серии, которые выглядят так:нужно транспонировать панд dataframe

 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 

Имеются дубликаты идентификаторов, поскольку несколько значений в col1 можно отнести к одному идентификатору.

Как достичь желаемого результата?

Спасибо!

ответ

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 

Или, используйте groupby и unstack

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