2013-11-21 3 views
15

Wurde versucht, eine Pivot-Tabelle mit mehreren Spalten "Werte" zu generieren. Ich weiß, dass ich Aggfunc verwenden kann, um Werte zu aggregieren, wie ich will, aber was ist, wenn ich nicht beide Spalten zusammenfassen möchte, sondern stattdessen die Summe einer Spalte und die der anderen Spalte benötige. Also ist es möglich, dies mit Pandas zu tun?Definieren Sie Aggfunc für jede Spalte Werte in Pandas Pivot-Tabelle

df = pd.DataFrame({ 
      'A' : ['one', 'one', 'two', 'three'] * 6, 
      'B' : ['A', 'B', 'C'] * 8, 
      'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 4, 
      'D' : np.random.randn(24), 
      'E' : np.random.randn(24) 
}) 

Nun wird dies eine Pivot-Tabelle mit Summe erhalten:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.sum) 

Und dieses für Mittel:

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=np.mean) 

Wie kann ich Summe für D und bedeuten für E bekommen?

Hope meine Frage ist klar genug.

Antwort

19

Sie können Concat zwei Datenrahmen:

>>> df1 = pd.pivot_table(df, values=['D'], rows=['B'], aggfunc=np.sum) 
>>> df2 = pd.pivot_table(df, values=['E'], rows=['B'], aggfunc=np.mean) 
>>> pd.concat((df1, df2), axis=1) 
      D   E 
B      
A 1.810847 -0.524178 
B 2.762190 -0.443031 
C 0.867519 0.078460 

oder Sie können Pass Liste der Funktionen als aggfunc Parameter und indizieren dann:

>>> df3 = pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc=[np.sum, np.mean]) 
>>> df3 
     sum    mean   
      D   E   D   E 
B           
A 1.810847 -4.193425 0.226356 -0.524178 
B 2.762190 -3.544245 0.345274 -0.443031 
C 0.867519 0.627677 0.108440 0.078460 
>>> df3 = df3.ix[:, [('sum', 'D'), ('mean','E')]] 
>>> df3.columns = ['D', 'E'] 
>>> df3 
      D   E 
B      
A 1.810847 -0.524178 
B 2.762190 -0.443031 
C 0.867519 0.078460 

Alghouth, wäre es schön, haben eine Option zum Definieren aggfunc für jede Spalte einzeln. Weiß nicht, wie es gemacht werden könnte, kann in aggfunc dict-like Parameter übergeben werden, wie {'D':np.mean, 'E':np.sum}.

Update Eigentlich Sie in Ihrem Fall kann von Hand Dreh:

>>> df.groupby('B').aggregate({'D':np.sum, 'E':np.mean}) 
      E   D 
B      
A -0.524178 1.810847 
B -0.443031 2.762190 
C 0.078460 0.867519 
+1

Danke, beide Möglichkeiten würden funktionieren. Aber was ich mir erhofft hatte, war ein einzelner Schritt. Wie Sie gesagt haben, können Sie für jede einzelne Spalte Funktionen definieren. Ich werde warten, wenn irgendjemand anderes von einer solchen Art weiß, sonst werde ich Ihre als eine Antwort in einer Weile akzeptieren. –

+0

@VIKASHJAISWAL siehe dritte Methode, ich denke, das ist, was Sie brauchen –

+0

Excellent. Genau das, was ich gesucht habe, funktioniert in der Tat auch für die Gruppierung mit mehreren Spalten, df.groupby (['B', 'C']). Aggregate ({'D': np.sum, 'E': np. bedeuten}). Danke für Ihre Bemühungen. –

40

Sie können, indem man in einem dict eine bestimmte Funktion auf eine bestimmte Spalte anwenden.

pd.pivot_table(df, values=['D','E'], rows=['B'], aggfunc={'D':np.sum, 'E':np.mean}) 
+3

Sehr nette Antwort. Elegant im Vergleich zur markierten Antwort. – whytheq

Verwandte Themen