API · Pandas
Funzione Pandas cut
Questo tutorial spiega come suddividere i dati in intervalli, detti anche bin, utilizzando la funzione pandas.cut().
In questa pagina
La funzione pandas.cut() assegna valori numerici a intervalli, detti anche bin. Restituisce una categoria di intervallo per ogni valore in ingresso: è quindi utile per raggruppare misurazioni continue, come età o punteggi, ai fini dell’analisi. È possibile fornire punti di taglio espliciti oppure chiedere a pandas di suddividere un intervallo in un numero specificato di bin.
Sintassi, parametri e valore restituito
La chiamata alla funzione è pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates="raise", ordered=True).
Gli argomenti usati più spesso sono:
| Parametro | Descrizione |
|---|---|
x |
Valori numerici simili a un array da assegnare, per esempio una lista, una Series o una colonna di un DataFrame. |
bins |
Un numero intero di bin della stessa larghezza, una sequenza di punti di taglio espliciti oppure un IntervalIndex. Se si specifica un numero intero, pandas ricava l’intervallo dal minimo e dal massimo di x, lo suddivide in quel numero di bin della stessa larghezza ed estende l’intervallo dello 0,1% su ciascun lato, così da includere entrambi i valori estremi. Una sequenza fornisce direttamente i punti di taglio e non applica questa estensione prevista per i bin specificati come numero intero. |
right |
Se è True (valore predefinito), gli intervalli includono l’estremo destro. Impostarlo su False crea intervalli chiusi a sinistra. |
labels |
Etichette facoltative, una per ogni bin. Usare False per restituire le posizioni numeriche dei bin. |
retbins |
Se è True, restituisce anche i punti di taglio usati per formare i bin. |
precision |
Precisione usata per memorizzare e visualizzare i punti di taglio. |
include_lowest |
Se è True, include il punto di taglio più basso nel primo intervallo. |
duplicates |
Scegliere "raise" (valore predefinito) oppure "drop" se i punti di taglio contengono valori duplicati. |
ordered |
Indica se le categorie risultanti sono ordinate; il valore predefinito è True. |
Di norma il risultato contiene un valore categorico per ogni elemento di x. Un valore che non rientra in alcun intervallo è rappresentato da NaN. Con retbins=True, la funzione restituisce una coppia: il risultato relativo a ciascun valore e l’array dei punti di taglio.
Assegnare i valori del DataFrame agli intervalli
Passare una colonna del DataFrame come x, specificare i punti di taglio degli intervalli con bins e assegnare la Series restituita a una nuova colonna. Eseguire questo esempio:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import pandas as pd
df = pd.DataFrame(
{
"Name": ["Anish", "Birat", "Chirag", "Kabin", "Sachin"],
"Age": [23, 34, 38, 45, 27],
"Score": [316, 322, 332, 330, 325],
}
)
df["Age-Range"] = pd.cut(df["Age"], bins=[20, 30, 40, 50])
print(df[["Age", "Age-Range"]].to_string(index=False))
I bin sono tre perché quattro punti di taglio definiscono tre intervalli. Ogni riga mantiene la posizione originale e il valore Age-Range indica l’intervallo che contiene l’età della riga. Per esempio, con la convenzione predefinita l’età 23 rientra in (20, 30], mentre l’età 45 rientra in (40, 50].
Controllare i limiti degli intervalli
Per impostazione predefinita, right=True crea intervalli chiusi a destra. La notazione (20, 30] indica valori maggiori di 20 e minori o uguali a 30: 20 è escluso e 30 è incluso. include_lowest=True include anche il punto di taglio più basso nel primo intervallo. Impostare right=False per usare intervalli chiusi a sinistra e aperti a destra, come [20, 30), che includono 20 ed escludono 30. Con questa impostazione, il punto di taglio più alto non rientra nell’ultimo intervallo. I valori che non corrispondono a nessun intervallo restituiscono NaN.
L’esempio seguente confronta queste opzioni per età corrispondenti ai punti di taglio o comprese tra di essi:
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import pandas as pd
ages = pd.Series([20, 23, 30, 45, 50], name="Age")
result = pd.DataFrame(
{
"Age": ages,
"default": pd.cut(ages, bins=[20, 30, 40, 50]),
"include_lowest": pd.cut(
ages, bins=[20, 30, 40, 50], include_lowest=True
),
"left_closed": pd.cut(
ages, bins=[20, 30, 40, 50], right=False
),
}
)
print(result.to_string(index=False))
Confrontare le righe con 20 e 50 per vedere come la scelta degli estremi influisce sull’appartenenza agli intervalli. Il comportamento predefinito include 50 nell’ultimo intervallo ma esclude 20 dal primo; include_lowest=True aggiunge 20 al primo intervallo, mentre right=False include 20 e lascia 50 fuori dall’intervallo finale.
Assegnare etichette agli intervalli
Per mostrare nomi di categoria leggibili invece della notazione degli intervalli, passare un’etichetta per ciascun bin. Le etichette seguono l’ordine degli intervalli: per tre bin servono quindi tre etichette.
Il codice e le etichette o gli output visibili in questa sezione restano in inglese.
import pandas as pd
ages = pd.Series([23, 34, 38, 45, 27], name="Age")
labels = ["21 to 30", "31 to 40", "41 to 50"]
age_groups = pd.cut(
ages,
bins=[20, 30, 40, 50],
labels=labels,
)
print(age_groups.to_string(index=False))
Con le impostazioni predefinite, la prima etichetta corrisponde a (20, 30], la seconda a (30, 40] e la terza a (40, 50]. Se servono posizioni numeriche dei gruppi anziché nomi, passare labels=False; pandas restituisce quindi codici interi per i valori assegnati a un bin.
Restituire i limiti degli intervalli con retbins=True
Impostare retbins=True quando servono sia le categorie assegnate a ciascun valore sia i punti di taglio usati. Il primo elemento restituito corrisponde a x; il secondo è l’array condiviso dei limiti dei bin. Questo esempio assegna entrambi a due variabili. Nell’output, le intestazioni Groups: e Bin edges: restano in inglese perché sono stringhe contenute nel codice invariato:
import pandas as pd
ages = pd.Series([23, 34, 38, 45, 27], name="Age")
age_groups, bin_edges = pd.cut(
ages,
bins=[20, 30, 40, 50],
labels=["21 to 30", "31 to 40", "41 to 50"],
retbins=True,
)
print("Groups:")
print(age_groups.to_string(index=False))
print("Bin edges:")
print(bin_edges)
age_groups contiene un risultato etichettato per ogni età, mentre bin_edges contiene [20, 30, 40, 50]. Lo stesso schema è utile quando bins è un numero intero e pandas calcola punti di taglio equidistanti: conservare i limiti restituiti se occorre esaminarli o riutilizzarli.