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?

Bemühen
quelle

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
Steven G.
quelle
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')
Saurabh
quelle
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
Gazala Muhamed
quelle
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
Demetri Pananos
quelle
19
df.groupby(['Fruit','Name'])['Number'].sum()

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

jared
quelle
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
YOBEN_S
quelle
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"})
xxyjoel
quelle