Pivot Table Pandas: Guida Avanzata per l’Analisi Dati Efficace in Python

Cerca:

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors
Pandas Pivot Table Avanzate

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.
Forse potrebbe interessarti anche:  3 Esercizi Pratici per Imparare Pandas: Pulizia Dati, Filtri Booleani e Merge tra DataFrame

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 MultiIndex permette 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’esempio pivot_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 MultiColumns permette 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.
Forse potrebbe interessarti anche:  Analisi del Sentiment: Perché le Regex non Bastano Più e Come BERT Cambia le Regole del Gioco

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 valori NaN vengono ignorati; la somma di un insieme con NaN è la somma dei valori non-NaN.
  • mean(): I valori NaN vengono ignorati; la media è calcolata solo sui valori non-NaN.
  • count(): Conta solo i valori non-NaN.
  • min(), max(): I valori NaN vengono 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.
Forse potrebbe interessarti anche:  Outcome Bias e Sport Analytics: Perché i Risultati nel Calcio Mentono (e Come Dimostrarlo in Python)

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 index che columns, 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.

 

 

Pubblicità