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.