2016-04-29 23 views
0
df = pd.DataFrame({'a':['y',NaN,'y',NaN,NaN,'x','x','y',NaN],'b':[NaN,'x',NaN,'y','x',NaN,NaN,NaN,'y'],'d':[1,0,0,1,1,1,0,1,0]}) 

Ich versuche, diesen Datenrahmen mit sum zusammenzufassen. Ich dachte df.groupby(['a','b']).aggregate(sum) würde funktionieren, aber es gibt eine leere Series zurück.Zusammenfassung Datenrahmen in Pandas - Python

Wie erreiche ich dieses Ergebnis?

a b 
x 1 1 
y 2 1 
+0

@unutbu: Sorry, du hast Recht, die zweite Zeile sollte y 2 1. Ich habe es bearbeitet. – HappyPy

Antwort

2
import numpy as np 
import pandas as pd 
NaN = np.nan 

df = pd.DataFrame(
    {'a':['y',NaN,'y',NaN,NaN,'x','x','y',NaN], 
    'b':[NaN,'x',NaN,'y','x',NaN,NaN,NaN,'y'], 
    'd':[32,12,55,98,23,11,9,91,3]}) 

melted = pd.melt(df, id_vars=['d'], value_vars=['a', 'b']) 
result = pd.pivot_table(melted, values='d', index=['value'], columns=['variable'], 
         aggfunc=np.median) 
print(result) 

Ausbeuten

variable  a  b 
value    
x   10.0 17.5 
y   55.0 50.5 

Erläuterung:

Melting the DataFrame mit melted = pd.melt(df, value_vars=['a', 'b']) produziert

 d variable value 
0 32  a  y 
1 12  a NaN 
2 55  a  y 
3 98  a NaN 
4 23  a NaN 
5 11  a  x 
6 9  a  x 
7 91  a  y 
8 3  a NaN 
9 32  b NaN 
10 12  b  x 
11 55  b NaN 
12 98  b  y 
13 23  b  x 
14 11  b NaN 
15 9  b NaN 
16 91  b NaN 
17 3  b  y 

und jetzt können wir pd.pivot_table verwenden, um die d Werte zu schwenken und aggregieren:

result = pd.pivot_table(melted, values='d', index=['value'], columns=['variable'], 
         aggfunc=np.median) 

Beachten Sie, dass die aggfunc eine Liste von Funktionen übernehmen, wie [np.sum, np.median, np.min, np.max, np.std] wenn Sie die Daten in mehr als einer Weise zusammenfassen wollen .

+0

Danke für Ihre Antwort! Aber gibt es einen Weg, dies etwas flexibler zu machen? Wenn ich zum Beispiel "d": [32,12,55,98,23,11,9,91,3] hätte und Mediane statt Summen berechnen wollte, würde es nicht funktionieren. – HappyPy

+0

Ja - anstelle von 'pd.crosstab' (das eine Häufigkeitstabelle erstellt) verwenden Sie' pd.pivot_table' mit Ihrer Wahl von 'aggfunc'. – unutbu

+0

Perfekt, es funktioniert super !! Vielen Dank für Ihre Hilfe und gute Erklärung! – HappyPy

Verwandte Themen