Aggregate i dati su Pandas e Python con il metodo Groupby

Tramite il metodo groupby possiamo ottenere informazioni aggregate a partire da un DataFrame della libreria Pandas del linguaggio Python. In questo modo possiamo svolgere facilmente anche su Python tutte quelle tipologie di analisi risolte dalla clausola Group By del linguaggio SQL o dalle tabelle Pivot di Excel.

Sintassi groupby di pandas e confronto con Group by SQL

Iniziamo da un esempio molto semplice per introdurre la sintassi del metodo groupby. Supponiamo ad esempio di avere un DataFrame di nome fatture e di voler calcolare “il numero di fatture e la somma degli importi per ogni data“. Scriveremo con Python il seguente codice

import numpy as np
fatture.groupby(by = "DataFattura",
                as_index = False, 
                dropna = False) \
        .agg(conteggio = ("NumeroFattura",
                          np.size),
             somma_importo = ("Importo",
                              np.sum))

Iniziamo ad analizzare i parametri principali del metodo group by:

  • le colonne da usare per effettuare il raggruppamento sono definite nel parametro by. Se volessi raggruppare su più colonne potrei utilizzare una lista valorizzando il parametro in questa modo: by = [“DataFattura”, “IdCliente”] ;
  • as_index = False permette di visualizzare in output, come usuali colonne, quelle che sono riportate nel parametro by. Il valore di Default di as_index è True. La prossima immagine confronta proprio le due tipologie di output:effetto del parametro as_index sul metodo groupby di pandas
  • dropna = False permette di visualizzare in output anche i dati relativi alle righe del DataFrame di partenza dove la colonna indicata nel parametro by è null. Anche in questo caso il default è True che quindi filtrerebbe dal risultato finale gli eventuali null presenti all’interno della colonna DataFattura.

Per calcolare le aggregazioni abbiamo bisogno di concatenare il risultato di groupby con il metodo agg. Infatti, dopo agg possiamo definire i nomi delle colonne che vogliamo visualizzare in output. Ognuna di queste colonne sarà valorizzata con una tupla di due elementi contenente:

  • il nome della colonna del DataFrame di partenza da aggregare;
  • la relativa funzione di aggregazione della libreria numpy, come ad esempio size, mean o sum.

Nell’esempio in alto abbiamo definito due nuove colonne in output (conteggio e somma_importo) valorizzate rispettivamente come la dimensione della colonna NumeroFattura e la somma della colonna Importo.

Il codice usato in questo esempio richiede almeno la versione 1.1.5 di Pandas. Per ottenere un risultato analogo in SQL, avremmo invece scritto la query

SELECT 
 DataFattura,
 COUNT(*) AS conteggio,
 SUM(Importo) AS somma_importo
FROM Fatture
GROUP BY
 DataFattura;

Creare un grafico in pandas dopo una groupby

L’output del metodo .groupby si presta a essere facilmente rappresentato graficamente tramite un diagramma a barre o una torta.

Basterà usare il metodo .plot e specificare:

  • la colonna da usare nell’asse x (che corrisponderà a quella definita nel parametro by nel groupby);
  • la colonna da usare nell’asse y (una di quelle create nel agg);
  • il tipo di grafico nel parametro kind (ad esempio pie per un grafico a torta o bar per un diagramma a barre).

Mostriamo ad esempio l’output di questo codice

import numpy as np
fatture.groupby(by = "NumeroFornitore",
                as_index = False, 
                dropna = False) \
       .agg(somma_importo = ("Importo",
                             np.sum)) \
       .plot(x = "NumeroFornitore",
             y = "somma_importo", 
             kind = "bar")

Otterremo questo grafico:

grafico ottenuto dopo una groupby con pandas

Aggregare i dati di una o più colonne

Nel caso non sia necessario raggruppare i dati per i valori di una colonna, ma siamo interessati semplicemente al calcolo di indici statistici, pandas ci mette a disposizione una sintassi molto efficiente e leggera. Ad esempio la sintassi

fatture["Importo"].sum()

fornisce un risultato sostanzialmente equivalente a quello della query SQL

SELECT SUM(Importo)
FROM   Fatture;

Tuttavia, per questa tipologia di analisi la sintassi di pandas è estremamente più flessibile perché ci permette in un sol colpo di calcolare la somma di tutte le colonne del DataFrame, cosa che sull’SQL è impossibile a meno di specificare la somma per ognuna delle colonne. Con pandas ci basterà invece scrivere

fatture.sum(numeric_only = True)

per ottenere un output come questo

risultato metodo sum su tutte le colonne del dataframe

Analogamente, possiamo calcolare tutti i principali indici statistici senza doverli specificare, tramite il metodo describe(). Anche questo risultato non è così facilmente calcolabile con l’SQL, mentre con pandas ci basterà scrivere questa istruzione

fatture["Importo"].describe()

per ottenere:

  • numero di righe senza null;
  • media;
  • deviazione standard;
  • massimo e minimo;
  • mediana, primo e terzo quartile.

Continua a imparare

Torna in alto
Torna su