Panda raggruppati per somma


207

Sto usando questo frame di dati:

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

Voglio aggregare questo per nome e poi per frutto per ottenere un numero totale di frutti per nome.

Bob,Apples,16 ( for example )

Ho provato a raggruppare per nome e frutta, ma come posso ottenere il numero totale di frutta.

Risposte:


211

Utilizzare 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

95
Come possono i panda sapere che voglio sommare il nome col Number?
Kingname

12
@Kingname è l'ultima colonna rimasta se estrai NAME e FRUIT. se aggiungi 2 colonne a sinistra, somma entrambe le colonne
Steven G

9
Come specificare quale colonna sommare?
tgdn,

36
@tgdn df.groupby (['Name', 'Fruit']) ['Number']. sum ()
Steven G

2
@StevenG Per la risposta fornita per riassumere una colonna specifica, l'output viene visualizzato come una serie Pandas anziché come Dataframe. Dal commento di Jakub Kukul (nella risposta sotto), possiamo usare doppie parentesi quadre attorno a 'Numero' per ottenere un Dataframe.
skdhfgeq2134,

179

Inoltre puoi usare la funzione agg,

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

1
Ciò differisce dalla risposta accettata in quanto restituisce a Seriesmentre l'altro restituisce un GroupByoggetto.
Gaurang Tandon,

11
@GaurangTandon per ottenere DataFrameinvece l'oggetto (come nella risposta accettata), usa le doppie parentesi quadre intorno 'Number', cioè:df.groupby(['Name', 'Fruit'])[['Number']].agg('sum')
Jakub Kukul

1
Molto utile per ripulire il rapporto di query con codifica errata.
avirr

93

Se si desidera mantenere le colonne originali Fruite Name, utilizzare reset_index(). Altrimenti Fruite Namediventerà parte dell'indice.

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

Come visto nelle altre risposte:

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

Entrambe le altre risposte realizzano ciò che vuoi.

È possibile utilizzare la pivotfunzionalità per disporre i dati in una bella tabella

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()

È possibile selezionare colonne diverse per sommare i numeri.


7

È possibile impostare la groupbycolonna su index quindi utilizzando sumconlevel

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

Una variazione sulla funzione .agg (); fornisce la possibilità di (1) persistere DataFrame di tipo, (2) applicare medie, conteggi, sommazioni, ecc. e (3) abilita il groupby su più colonne mantenendo la leggibilità.

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

usando i tuoi valori ...

df.groupby(['Name', 'Fruit']).agg({'Number': "sum"})
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.