Was ist der beste Weg, um eine Gruppierung auf einem Pandas-Datenframe zu tun, aber einige Spalten aus dieser Gruppierung ausschließen? z.B. Ich habe die folgenden Datenframe:
Code Land Artikel_Code Artikel Ele_Code Einheit Y1961 Y1962 Y1963
2 Afghanistan 15 Weizen 5312 Ha 10 20 30
2 Afghanistan 25 Mais 5312 Ha 10 20 30
4 Angola 15 Weizen 7312 Ha 30 40 50
4 Angola 25 Mais 7312 Ha 30 40 50
Ich möchte nach den Spalten Land und Item_Code gruppieren und nur die Summe der Zeilen berechnen, die unter die Spalten Y1961, Y1962 und Y1963 fallen. Der resultierende Datenrahmen sollte wie folgt aussehen:
Code Land Item_Code Item Ele_Code Einheit Y1961 Y1962 Y1963
2 Afghanistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
Im Moment mache ich dies:
df.groupby('Country').sum()
Dabei werden jedoch auch die Werte in der Spalte "Item_Code" addiert. Kann ich irgendwie festlegen, welche Spalten in die Operation "Summe()" einbezogen und welche ausgeschlossen werden sollen?
Sie können die Spalten eines Gruppierers auswählen:
In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
Y1961 Y1962 Y1963
Country Item_Code
Afghanistan 15 10 20 30
25 10 20 30
Angola 15 30 40 50
25 30 40 50
*Beachten Sie, dass die übergebene Liste eine Teilmenge der Spalten sein muss, sonst wird ein KeyError angezeigt.
Die Funktion agg
wird dies für Sie tun. Übergeben Sie die Spalten und die Funktion als dict mit column, output:
df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column
Dadurch werden nur die Gruppenspalten und die angegebenen Aggregatspalten angezeigt. In diesem Beispiel habe ich zwei Agg-Funktionen auf 'Y1962' angewendet.
Um genau das zu erhalten, was Sie sich erhofft haben, schließen Sie die anderen Spalten in die Gruppierung nach ein und wenden Sie Summen auf die Y-Variablen im Rahmen an:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
Wenn Sie nach einer allgemeineren Methode suchen, die auf viele Spalten anwendbar ist, können Sie eine Liste von Spaltennamen erstellen und diese als Index des gruppierten Datenrahmens übergeben. In Ihrem Fall, zum Beispiel:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')