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.