2017-08-10 5 views
0

Mein Datenrahmen sieht derzeit wie:Pivot Zeilen in Pandas Dataframe

ID    FIELD  VALUE 
12463634   TEST   22.2 
12463634  E_REASON   010 
12463634  IN_SCOPE   Y 
12463635   TEST   99.5 
12463635  E_REASON   020 
12463635  IN_SCOPE   N 

ich meinen Datenrahmen mag wie folgt aussehen:

ID   TEST  E_REASON  IN_SCOPE 
12463634  22.2   010   Y 
12463635  99.5   020   N 

Ich habe versucht, diesen Code ausgeführt wird:

df.pivot_table(index = "ID", columns = "FIELD", values = "VALUE") 

Allerdings sehe ich diesen Fehler:

DataError: No numeric types to aggregate 

Bitte beraten. Vielen Dank!

+0

Ich denke, was Sie möglicherweise wollen, ist 'Pivot' anstatt' Pivot_Table'. – Ajean

+0

Nur wenn sie nicht eindeutige Indizes erstellen. Ich habe es gerade versucht und Pivot funktioniert gut. – Ajean

Antwort

1

Verwenden pivot oder unstack:

df = df.pivot(index = "ID", columns = "FIELD", values = "VALUE") 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  Y 22.2 
12463635  020  N 99.5 

df = df.set_index(['ID', 'FIELD'])['VALUE'].unstack() 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  Y 22.2 
12463635  020  N 99.5 

Wenn Duplikate müssen pivot_table mit einigen Aggregatfunktion - sum oder ','join:

print (df) 
     ID  FIELD VALUE 
0 12463634  TEST 22.2 
1 12463634 E_REASON 010 
2 12463634 IN_SCOPE  Y<-same ID and FIELED 
3 12463634 IN_SCOPE Y1<-same ID and FIELED 
4 12463635  TEST 99.5 
5 12463635 E_REASON 020 
6 12463635 IN_SCOPE  N 


df = df.pivot_table(index = "ID", columns = "FIELD", values = "VALUE", aggfunc='sum') 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  YY1 22.2 
12463635  020  N 99.5 

Oder:

df = df.pivot_table(index = "ID", columns = "FIELD", values = "VALUE", aggfunc=','.join) 
print (df) 
FIELD E_REASON IN_SCOPE TEST 
ID        
12463634  010  Y,Y1 22.2 
12463635  020  N 99.5 
+1

Pivot klappte gut - danke! – kbball

0

Eine alternative Möglichkeit ist, wie etwas zu tun:

df.groupby(['ID', 'FIELD']).sum().unstack() 

Auf diese Weise können Sie das Etikett nicht verlieren 'VALUES'

Erklärung

Sie können groupby und sum(), die Ihnen

In [31]: df.groupby(['ID', 'FIELD']).sum() 
Out[31]: 
        VALUE 
ID  FIELD 
12463634 E_REASON 010 
     IN_SCOPE  Y 
     TEST  22.2 
12463635 E_REASON 020 
     IN_SCOPE  N 
     TEST  99.5 

Dann verschiebt die unstack die letzte indizierte Reihe zu einer Spalte