it-swarm.com.de

Pandas summieren sich nach Gruppen, schließen jedoch bestimmte Spalten aus

Was ist der beste Weg, um ein Groupby auf einem Pandas dataframe durchzuführen, aber einige Spalten von dieser Groupby auszuschließen? Zum Beispiel habe ich den folgenden Dataframe:

Code   Country      Item_Code   Item    Ele_Code    Unit    Y1961    Y1962   Y1963
2      Afghanistan  15          Wheat   5312        Ha      10       20      30
2      Afghanistan  25          Maize   5312        Ha      10       20      30
4      Angola       15          Wheat   7312        Ha      30       40      50
4      Angola       25          Maize   7312        Ha      30       40      50

Ich möchte die Spalten Country und Item_Code gruppieren und nur die Summe der Zeilen berechnen, die unter die Spalten Y1961, Y1962 und Y1963 fallen. Der resultierende Datenrahmen sollte folgendermaßen aussehen:

Code   Country      Item_Code   Item    Ele_Code    Unit    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 das:

df.groupby('Country').sum()

Dies addiert jedoch auch die Werte in der Item_Code-Spalte. Kann ich auf irgendeine Weise angeben, welche Spalten in die sum() -Operation einbezogen und welche ausgeschlossen werden sollen?

71
user308827

Sie können die Spalten einer Gruppe auswählen, indem Sie:

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, da sonst ein KeyError angezeigt wird.

97
Andy Hayden

Die Funktion agg erledigt dies für Sie. Übergeben Sie die Spalten und geben Sie Folgendes aus:

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 Spaltengruppen und die angegebenen Aggregatspalten angezeigt. In diesem Beispiel habe ich zwei Agg-Funktionen für 'Y1962' eingefügt.

Um genau das zu erhalten, was Sie sich erhofft hatten, schließen Sie die anderen Spalten in die Gruppe nach ein und wenden Sie Summen auf die Y-Variablen im Frame an:

df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
32
leroyJr

Wenn Sie eine allgemeinere Methode zum Anwenden auf viele Spalten suchen, können Sie eine Liste mit 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')
11
Superstar