Come sommare i valori raggruppati per due colonne in panda


21

Ho un Pandas DataFrame come questo:

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

Come posso generare un nuovo DataFrame come questo:

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5

Risposte:


16

pivot_table è stato fatto per questo:

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

risultati in

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

Personalmente trovo questo approccio molto più facile da capire, e certamente più pitonico di un'operazione di groupby contorta. Quindi se vuoi il formato specificato puoi semplicemente riordinarlo:

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

che ti dà

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

1
Bello! Questa dovrebbe essere la risposta accettata.
— tuomastik,

@Josh D. Questo è bello e semplice! Sono d'accordo che ci vuole un po 'di potere cerebrale per capire come funziona il groupby. Grazie!
— Kevin,

8

Panda magici neri:

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

Risultante df:

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

Santo! La magia nera è così potente! Molte grazie!
— Kevin,

Prego! Vedi la risposta aggiornata; Ho semplificato l'espressione e aggiunto una correzione per i nomi delle colonne esattamente come richiesto.
— tuomastik,

Penso che la tua versione precedente abbia il suo vantaggio poiché può essere applicata ad altri set di dati più complicati. L'ho copiato qui: df.groupby (['Data', 'Gruppi', 'dati']) ['dati']. Sum (). Sum (level = ['Date', 'Groups']). Unstack ( 'Gruppi'). Fillna (0)
— Kevin

@Kevin Se questa o una qualsiasi risposta futura ha risolto il tuo problema, accetta la risposta.
— tuomastik,
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.