Pandas Gruppierung und Summe


205

Ich benutze diesen Datenrahmen:

Fruit   Date      Name  Number
Apples  10/6/2016 Bob    7
Apples  10/6/2016 Bob    8
Apples  10/6/2016 Mike   9
Apples  10/7/2016 Steve 10
Apples  10/7/2016 Bob    1
Oranges 10/7/2016 Bob    2
Oranges 10/6/2016 Tom   15
Oranges 10/6/2016 Mike  57
Oranges 10/6/2016 Bob   65
Oranges 10/7/2016 Tony   1
Grapes  10/7/2016 Bob    1
Grapes  10/7/2016 Tom   87
Grapes  10/7/2016 Bob   22
Grapes  10/7/2016 Bob   12
Grapes  10/7/2016 Tony  15

Ich möchte dies nach Namen und dann nach Früchten zusammenfassen, um eine Gesamtzahl von Früchten pro Name zu erhalten.

Bob,Apples,16 ( for example )

Ich habe versucht, nach Namen und Früchten zu gruppieren, aber wie erhalte ich die Gesamtzahl der Früchte?

Antworten:


210

Verwendung GroupBy.sum:

df.groupby(['Fruit','Name']).sum()

Out[31]: 
               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Grapes  Bob        35
        Tom        87
        Tony       15
Oranges Bob        67
        Mike       57
        Tom        15
        Tony        1

94
Wie können Pandas wissen, dass ich die genannte Spalte summieren möchte Number?
— Kingname

12
@Kingname Es ist die letzte Spalte, die noch übrig ist, wenn Sie NAME und FRUIT herausnehmen. Wenn Sie noch 2 Spalten hinzufügen, werden beide Spalten summiert
— Steven G

9
Wie kann man angeben, welche Spalte summiert werden soll?
— tgdn

34
@tgdn df.groupby (['Name', 'Frucht']) ['Nummer']. sum ()
— Steven G

2
@StevenG Für die Antwort zur Zusammenfassung einer bestimmten Spalte wird die Ausgabe als Pandas-Serie anstelle von Dataframe ausgegeben. Aus dem Kommentar von Jakub Kukul (in der Antwort unten) können wir doppelte eckige Klammern um 'Number' verwenden, um einen Datenrahmen zu erhalten.
— skdhfgeq2134

177

Sie können auch die Agg-Funktion verwenden,

df.groupby(['Name', 'Fruit'])['Number'].agg('sum')

1
Dies unterscheidet sich von der akzeptierten Antwort darin, dass dies a zurückgibt, Serieswährend das andere ein GroupByObjekt zurückgibt .
— Gaurang Tandon

11
@ GaurangTandon, um DataFramestattdessen Objekt zu erhalten (wie in der akzeptierten Antwort), verwenden Sie doppelte eckige Klammern 'Number', dh:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
— Jakub Kukul

1
Sehr hilfreich beim Bereinigen von schlecht codierten Abfrageberichten.
— avirr

92

Wenn Sie die ursprünglichen Spalten behalten wollen Fruitund Nameverwenden reset_index(). Andernfalls Fruitund Namewird Teil des Index.

df.groupby(['Fruit','Name'])['Number'].sum().reset_index()

Fruit   Name       Number
Apples  Bob        16
Apples  Mike        9
Apples  Steve      10
Grapes  Bob        35
Grapes  Tom        87
Grapes  Tony       15
Oranges Bob        67
Oranges Mike       57
Oranges Tom        15
Oranges Tony        1

Wie in den anderen Antworten zu sehen:

df.groupby(['Fruit','Name'])['Number'].sum()

               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Grapes  Bob        35
        Tom        87
        Tony       15
Oranges Bob        67
        Mike       57
        Tom        15
        Tony        1

43

Beide anderen Antworten erreichen, was Sie wollen.

Sie können die pivotFunktionalität verwenden, um die Daten in einer schönen Tabelle anzuordnen

df.groupby(['Fruit','Name'],as_index = False).sum().pivot('Fruit','Name').fillna(0)



Name    Bob     Mike    Steve   Tom    Tony
Fruit                   
Apples  16.0    9.0     10.0    0.0     0.0
Grapes  35.0    0.0     0.0     87.0    15.0
Oranges 67.0    57.0    0.0     15.0    1.0

19
df.groupby(['Fruit','Name'])['Number'].sum()

Sie können verschiedene Spalten auswählen, um Zahlen zu summieren.


7

Sie können die groupbySpalte so einstellen , dass sie index dann summit verwendet wirdlevel

df.set_index(['Fruit','Name']).sum(level=[0,1])
Out[175]: 
               Number
Fruit   Name         
Apples  Bob        16
        Mike        9
        Steve      10
Oranges Bob        67
        Tom        15
        Mike       57
        Tony        1
Grapes  Bob        35
        Tom        87
        Tony       15

3

Eine Variation der .agg () -Funktion; Bietet die Möglichkeit, (1) den Typ DataFrame beizubehalten, (2) Durchschnittswerte, Zählwerte, Summierungen usw. anzuwenden und (3) das Gruppieren in mehreren Spalten zu aktivieren, während die Lesbarkeit erhalten bleibt.

df.groupby(['att1', 'att2']).agg({'att1': "count", 'att3': "sum",'att4': 'mean'})

mit deinen Werten ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.