2017-08-11 1 views
3

Ich versuche, diese Daten zu schwenken:Verschwenkung Daten Pandas

  ID 
UserID 
1  a1 
1  a2 
2  a1 
2  a3 

in einen Datenrahmen wie:

UserID a1 a2 a3 
1  1 1 0 
2  1 0 1 

Ich habe versucht, die folgenden df = pd.pivot_table(df, index='UserID', columns='ID' tun, aber es gibt mir einen Fehler DataError: No numeric types to aggregate . Was kann ich tun?

Antwort

6

Erste Spalte ist index, daher ist die Änderung index='UserID' zu index=df.index erforderlich.

Auch Aggregatfunktion ist GroupBy.size

df = pd.pivot_table(df, index=df.index, columns=df['ID'], aggfunc='size', fill_value=0) 
print (df) 
ID  a1 a2 a3 
UserID    
1  1 1 0 
2  1 0 1 

Lösung mit crosstab:

df = pd.crosstab(df.index,df['ID']) 
print (df) 
ID  a1 a2 a3 
row_0    
1  1 1 0 
2  1 0 1 

Or (pandas 0.20.1+) Lösung - groupby von index und Spalte zusammen, aggregieren size und umformen von unstack:

df = df.groupby(['UserID','ID']).size().unstack(fill_value=0) 
print (df) 
ID  a1 a2 a3 
UserID    
1  1 1 0 
2  1 0 1 

Pandas 0.20.1 Lösung unten - konvertieren Index Spalte von reset_index:

df = df.reset_index().groupby(['UserID','ID']).size().unstack(fill_value=0) 
print (df) 
ID  a1 a2 a3 
UserID    
1  1 1 0 
2  1 0 1 

EDIT:

Es scheint Index auch von Indexnamen ausgewählt werden kann (nicht sicher, ob es unten 0.20 funktioniert. 1):

df = pd.pivot_table(df, index='UserID', columns='ID', aggfunc='size', fill_value=0) 
print (df) 
ID  a1 a2 a3 
UserID    
1  1 1 0 
2  1 0 1 
+1

Wow so viele Möglichkeiten. – Dark