2017-02-11 4 views
2

Ich habe eine Serie, die wie folgt aussehen:Notwendigkeit, eine Pandas Datenrahmen zur Umsetzung

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

Meine gewünschte Ausgabe ist dies:

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 

ich diesen Code bekam:

import pandas as pd 

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

Ich erhalte einen Fehler:

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 

Es gibt doppelte IDs, da mehrere Werte in Spalte1 einer einzelnen ID zugeordnet werden können.

Wie kann ich die gewünschte Ausgabe erreichen?

Danke!

Antwort

9

könnten Sie verwenden 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 

Oder verwenden 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 

Oder verwenden groupby und 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 
Verwandte Themen