In questo articolo, esploreremo in profondità come utilizzare pd.pivot_table per riassumere, aggregare e analizzare i tuoi dati, proprio come faresti con uno strumento di business intelligence. Attraverso esempi pratici e spiegazioni dettagliate, padroneggerai concetti chiave come l’aggregazione, gli indici e le colonne multi-livello, la gestione dei valori mancanti e l’applicazione di funzioni di aggregazione multiple.
Pivot Tables
In questa guida avanzata, esploreremo tre funzionalità fondamentali di Pandas:
- Pivot Tables (
pd.pivot_table) → Per riassumere e analizzare dati in tabelle dinamiche
Ogni sezione include esempi pratici con dataset generati al volo.
👉Pandas Python: Tutorial Completo per l’Analisi e la Manipolazione dei Dati
👉Padroneggiare le Serie Temporali con Pandas: Convertire Datetime, Aggregare Dati con Tabelle Pivot e Altro
👉Plotting con Pandas: Crea e Personalizza Visualizzazioni di Dati con Python
Pivot Tables con pd.pivot_table
Le pivot table permettono di riassumere e aggregare dati in modo flessibile, simile a Excel.
Sintassi Base
pd.pivot_table(
data=df, # DataFrame di input
values=None, # Colonna da aggregare
index=None, # Raggruppamento per righe
columns=None, # Raggruppamento per colonne
aggfunc='mean' # Funzione di aggregazione (mean, sum, count, etc.))
Esempio Pratico
import pandas as pd
# Dataset di esempio: vendite di prodotti
data = {
'Giorno': ['Lun', 'Lun', 'Mar', 'Mar', 'Mer', 'Mer'],
'Prodotto': ['A', 'B', 'A', 'B', 'A', 'B'],
'Vendite': [100, 150, 200, 50, 120, 80],
'Regione': ['Nord', 'Sud', 'Nord', 'Sud', 'Nord', 'Sud']}
df = pd.DataFrame(data)
# Creazione pivot table
pivot = pd.pivot_table(
data=df,
values='Vendite',
index='Giorno',
columns='Prodotto',
aggfunc='sum')
print(pivot)
Output:
Prodotto A B
Giorno
Lun 100 150
Mar 200 50
Mer 120 80
Pivot Table Multi-Livello
pivot_multi = pd.pivot_table(
data=df,
values='Vendite',
index=['Giorno', 'Regione'],
columns='Prodotto',
aggfunc='sum')
print(pivot_multi)
Output:
Prodotto A B
Giorno Regione
Lun Nord 100 NaN
Sud NaN 150.0
Mar Nord 200 NaN
Sud NaN 50.0
Mer Nord 120 NaN
Sud NaN 80.0
Approfondiamo i concetti di aggregazione, indici e colonne multi-livello, gestione dei valori mancanti, funzioni di aggregazione multiple e margini nelle pivot table di Pandas.
Concetto di Aggregazione in Dettaglio
L’aggregazione è un processo fondamentale nell’analisi dei dati che consiste nel ridurre un insieme di valori in un singolo valore riassuntivo. Questo permette di ottenere una visione d’insieme delle tendenze, delle caratteristiche centrali o della dispersione dei dati all’interno di specifici gruppi.
Dal Punto di Vista Matematico:
Come hai giustamente introdotto, una funzione di aggregazione [math]f[/math] mappa un insieme di [math]n[/math] valori numerici [math]\{x_1, x_2, …, x_n\}[/math] a un singolo valore [math]y = f(x_1, x_2, …, x_n)[/math]. Ecco un’analisi più dettagliata degli esempi forniti:
- Media (Mean): [math]\mu = \frac{1}{n} \sum_{i=1}^{n} x_i[/math]. La media aritmetica rappresenta il valore centrale di un insieme di dati. Matematicamente, è la somma di tutti i valori divisa per il numero totale di valori. È sensibile ai valori anomali (outlier).
- Somma (Sum): [math]S = \sum_{i=1}^{n} x_i[/math]. La somma è il totale di tutti i valori in un insieme di dati. È utile per aggregare quantità o totali.
- Mediana (Median): La mediana è il valore centrale di un insieme di dati ordinato. Se il numero di osservazioni ([math]n[/math]) è dispari, la mediana è il valore in posizione [math]\frac{n+1}{2}[/math]. Se [math]n[/math] è pari, la mediana è la media dei due valori centrali in posizione [math]\frac{n}{2}[/math] e [math]\frac{n}{2} + 1[/math]. La mediana è meno sensibile ai valori anomali rispetto alla media.
- Varianza (Variance): [math]\sigma^2 = \frac{1}{n} \sum_{i=1}^{n} (x_i – \mu)^2[/math]. La varianza misura la dispersione dei dati attorno alla loro media. Matematicamente, è la media dei quadrati delle differenze tra ciascun valore e la media. Una varianza alta indica una maggiore dispersione. Esiste anche la varianza campionaria, dove si divide per [math]n-1[/math] invece di [math]n[/math], utilizzata per stimare la varianza di una popolazione da un campione.
- Deviazione Standard (Standard Deviation): [math]\sigma = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (x_i – \mu)^2}[/math]. La deviazione standard è la radice quadrata della varianza. Fornisce una misura della dispersione dei dati nella stessa unità di misura dei dati originali, rendendola più interpretabile rispetto alla varianza. Anche qui esiste la deviazione standard campionaria, calcolata usando la varianza campionaria.
- Conteggio (Count): Il conteggio restituisce il numero di elementi in un gruppo. Non coinvolge direttamente operazioni matematiche sui valori stessi, ma è una funzione di aggregazione fondamentale.
- Minimo (Minimum): [math]\min(x_1, x_2, …, x_n)[/math]. Restituisce il valore più piccolo nell’insieme di dati.
- Massimo (Maximum): [math]\max(x_1, x_2, …, x_n)[/math]. Restituisce il valore più grande nell’insieme di dati.
Dal Punto di Vista Teorico (in Contesto Pandas):
Nel contesto delle pivot table di Pandas, l’aggregazione avviene per i gruppi definiti dagli indici e dalle colonne. La funzione di aggregazione specificata in aggfunc viene applicata a tutti i valori della colonna values che rientrano in ciascuna combinazione unica di indice e colonna.
- Granularità dell’Analisi: L’aggregazione riduce la granularità dei dati. Invece di analizzare ogni singola riga, si analizzano statistiche riassuntive per gruppi.
- Identificazione di Pattern: L’aggregazione aiuta a identificare pattern e tendenze che potrebbero non essere evidenti a livello di singola osservazione. Ad esempio, la media delle vendite per regione può rivelare quali regioni hanno le performance migliori.
- Comparazioni: Le statistiche aggregate consentono confronti significativi tra diversi gruppi (es. confronto delle vendite medie tra diverse categorie di prodotti).
Indici Multipli e Colonne Multiple:
Logica e Rappresentazione Gerarchica:
Gli indici multi-livello (o MultiIndex) e le colonne multi-livello (MultiColumns) in Pandas introducono una struttura gerarchica all’interno di un DataFrame. Immagina di voler analizzare le vendite non solo per giorno e prodotto, ma anche per regione. Un indice singolo per il giorno non sarebbe sufficiente per distinguere le vendite dello stesso prodotto in giorni diversi ma in regioni diverse.
- Indici Multipli: Un
MultiIndexpermette di definire più livelli di etichette per le righe. Ogni riga non è identificata da una singola etichetta, ma da una tupla di etichette, dove ogni elemento della tupla corrisponde a un livello dell’indice. Nell’esempiopivot_multi, la riga con indice('Lun', 'Nord')è identificata univocamente dalla combinazione del giorno ‘Lun’ e della regione ‘Nord’. Questo crea una gerarchia dove il primo livello (‘Giorno’) contiene ‘Lun’, ‘Mar’, ‘Mer’, e il secondo livello (‘Regione’) contiene ‘Nord’, ‘Sud’ all’interno di ciascun giorno. - Colonne Multiple: Similmente, un
MultiColumnspermette di avere più livelli di etichette per le colonne. Questo è utile quando le colonne stesse possono essere raggruppate in categorie. Ad esempio, potresti avere colonne per diverse statistiche (‘Media’, ‘Somma’) per diversi prodotti (‘A’, ‘B’). La colonna per la media delle vendite del prodotto ‘A’ sarebbe identificata da una tupla come('A', 'Media').
Come Facilitano Analisi Complesse:
- Raggruppamenti Più Dettagliati: Permettono di raggruppare i dati in base a combinazioni di più variabili, fornendo una segmentazione più fine.
- Analisi a Livelli: Facilitano l’esecuzione di analisi a diversi livelli di granularità. Ad esempio, con un indice multi-livello per giorno e regione, puoi facilmente aggregare i dati per giorno (aggregando su tutte le regioni) o per regione (aggregando su tutti i giorni).
- Selezione e Filtraggio Avanzati: Rendono più intuitiva la selezione di sottoinsiemi di dati basati su specifici livelli dell’indice o delle colonne usando
.loc[]. - Presentazione dei Dati: Possono rendere le tabelle riassuntive più organizzate e interpretabili quando si analizzano dati multidimensionali.
Gestione dei Valori Mancanti (NaN):
Pandas gestisce i valori mancanti rappresentandoli con NaN (Not a Number), un tipo di dato speciale in floating-point. Durante l’aggregazione nelle pivot table, il comportamento predefinito è di escludere i valori NaN dai calcoli.
Impatto sull’Aggregazione:
sum(): I valoriNaNvengono ignorati; la somma di un insieme conNaNè la somma dei valori non-NaN.mean(): I valoriNaNvengono ignorati; la media è calcolata solo sui valori non-NaN.count(): Conta solo i valori non-NaN.min(),max(): I valoriNaNvengono ignorati.
Parametro fill_value:
Il parametro fill_value della funzione pd.pivot_table() permette di sostituire i valori mancanti che si creano quando una combinazione di indice e colonna non ha dati corrispondenti nella DataFrame originale. Questo non influisce su come le funzioni di aggregazione gestiscono i NaN presenti nei dati originali. Invece, riempie le celle vuote nella pivot table risultante.
Esempio:
Considera il pivot_multi dell’ esempio precedente. Dove non c’erano vendite per il Prodotto ‘A’ nel ‘Lun’ per la regione ‘Sud’, è apparso un NaN. Se avessimo usato fill_value=0 nella pd.pivot_table(), quel NaN sarebbe stato sostituito da 0. Questo è utile se vuoi che le celle vuote siano interpretate come zero vendite piuttosto che come dati mancanti.
Funzioni di Aggregazione Multiple:
Il parametro aggfunc di pd.pivot_table() non si limita ad accettare una singola stringa (come ‘mean’ o ‘sum’). Può anche accettare:
- Una lista di funzioni (stringhe o funzioni Python): In questo caso, per ogni combinazione di indice e colonna, verranno calcolate tutte le funzioni specificate nella lista, creando un livello aggiuntivo nelle colonne della pivot table per distinguere i risultati di ciascuna funzione.
- Un dizionario: Questo è il modo più flessibile. Il dizionario ha come chiavi i nomi delle colonne da aggregare (dal parametro
values) e come valori la funzione (o una lista di funzioni) da applicare a quella specifica colonna. Questo permette di applicare diverse aggregazioni a diverse colonne contemporaneamente.
Esempio:
import pandas as pd
import numpy as np
data = {
'Giorno': ['Lun', 'Lun', 'Mar', 'Mar', 'Mer', 'Mer'],
'Prodotto': ['A', 'B', 'A', 'B', 'A', 'B'],
'Vendite': [100, 150, 200, 50, 120, 80],
'Quantita': [10, 15, 20, 5, 12, 8]}
df = pd.DataFrame(data)
# Aggregazione multipla con una lista
pivot_multi_func = pd.pivot_table(
data=df,
values=['Vendite', 'Quantita'],
index='Giorno',
columns='Prodotto',
aggfunc=['sum', 'mean'])
print("\nPivot Table con Aggregazioni Multiple (Lista):\n", pivot_multi_func)
# Aggregazione multipla con un dizionario
pivot_dict_func = pd.pivot_table(
data=df,
values=['Vendite', 'Quantita'],
index='Giorno',
columns='Prodotto',
aggfunc={'Vendite': 'sum', 'Quantita': 'mean'})
print("\nPivot Table con Aggregazioni Multiple (Dizionario):\n", pivot_dict_func)
Output del primo esempio:
Pivot Table con Aggregazioni Multiple (Lista):
Vendite Quantita
Prodotto A B A B
aggfunc
sum 320 230 32.0 23.0
mean 160 115 16.0 11.5
Output del secondo esempio:
Pivot Table con Aggregazioni Multiple (Dizionario):
Quantita Vendite
Prodotto A B A B
Giorno
Lun 12.5 11.5 100 150
Mar 20.0 5.0 200 50
Mer 12.0 8.0 120 80
Nell’output del primo esempio, avrai un MultiColumns con due livelli: il primo livello sarà ‘Vendite’ e ‘Quantita’, e il secondo livello sarà ‘sum’ e ‘mean’. Nel secondo esempio, il MultiColumns avrà ‘Vendite’ con solo ‘sum’ e ‘Quantita’ con solo ‘mean’.
Margini (margins=True):
Impostando il parametro margins=True nella funzione pd.pivot_table(), Pandas aggiunge righe e/o colonne di totali parziali e un totale generale alla pivot table risultante.
Come Funzionano:
- Se hai solo un
index, verranno aggiunte colonne di totali per ogni livello delle colonne e una colonna ‘All’ con il totale generale. - Se hai solo un
columns, verranno aggiunte righe di totali per ogni livello dell’indice e una riga ‘All’ con il totale generale. - Se hai sia
indexchecolumns, verranno aggiunte righe e colonne di totali parziali per ogni livello e una riga e colonna ‘All’ all’incrocio rappresenterà il totale generale.
Utilità:
- Riepiloghi Veloce: Forniscono un modo rapido per vedere i totali per diverse categorie e il totale complessivo senza dover eseguire calcoli separati.
- Verifica dei Dati: Possono essere utili per verificare che i dati siano stati aggregati correttamente.
- Presentazione: Rendono le tabelle più complete e informative per la presentazione dei risultati.
Esempio:
import pandas as pd
data = {
'Giorno': ['Lun', 'Lun', 'Mar', 'Mar', 'Mer', 'Mer'],
'Prodotto': ['A', 'B', 'A', 'B', 'A', 'B'],
'Vendite': [100, 150, 200, 50, 120, 80]}
df = pd.DataFrame(data)
pivot_with_margins = pd.pivot_table(
data=df,
values='Vendite',
index='Giorno',
columns='Prodotto',
aggfunc='sum',
margins=True,
margins_name='Totale') # Puoi personalizzare il nome del margine
print("\nPivot Table con Margini:\n", pivot_with_margins)
Output:
Pivot Table con Margini:
Prodotto A B Totale
Giorno
Lun 100 150 250
Mar 200 50 250
Mer 120 80 200
Totale 420 280 700
Nell’output, vedrai una riga ‘Totale’ in fondo (somma delle vendite per ogni prodotto) e una colonna ‘Totale’ a destra (somma delle vendite per ogni giorno) e un valore all’incrocio che rappresenta la somma totale di tutte le vendite.





