HOWTO · Pandas
Tre modi per normalizzare le colonne numeriche di un DataFrame in Pandas
Confronta la standardizzazione con la media (z-score), il ridimensionamento min-max e la normalizzazione per quantili per le colonne numeriche dei DataFrame Pandas, con formule ed esempi riutilizzabili.
In questa pagina
Per ridimensionare le colonne numeriche di un DataFrame Pandas, puoi scegliere fra tre approcci: la normalizzazione basata sulla media (standardizzazione z-score) centra ogni colonna e la scala in base alla sua deviazione standard; la scalatura min-max porta ogni colonna non costante nell’intervallo 0–1; la normalizzazione per quantili rimappa i valori in base al rango, avvicinando le colonne a una distribuzione comune. La scelta dipende dalla scala richiesta dal modello, dalla sensibilità ai valori anomali e dall’opportunità di rendere comparabili le distribuzioni delle colonne.
Normalizzazione dei dati in Pandas
La normalizzazione ridimensiona i valori, mentre la standardizzazione li centra rispetto alla media e li esprime in unità di deviazione standard. Questa guida illustra tre trasformazioni applicate per colonna. Pandas non offre un unico metodo dedicato di DataFrame per queste formule, ma le sue operazioni aritmetiche e di ordinamento per rango permettono di implementarle facilmente.
Gli esempi usano lo stesso DataFrame piccolo e deterministico, composto da quattro colonne numeriche. Ogni trasformazione opera lungo le singole colonne, che conservano così i propri nomi e gli indici di riga.
import pandas as pd
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
print(df)
A B C D
0 1 10 4 5
1 2 20 1 5
2 3 30 3 5
3 4 40 2 5
La colonna D è costante, così il suo comportamento risulta evidente nella sezione sulla scalatura min-max. Gli esempi seguenti sono autosufficienti e ricreano questo stesso input. I blocchi di codice e di output sono mantenuti invariati; eventuali etichette leggibili al loro interno restano in inglese.
Normalizzare un DataFrame Pandas con la normalizzazione basata sulla mean
La formula basata sulla media è (x - mean) / standard deviation e si calcola separatamente per ogni colonna. Si tratta della standardizzazione z-score: la media di ciascuna colonna trasformata è prossima a zero e i valori sono espressi in unità di deviazione standard, senza essere limitati all’intervallo 0–1. Per impostazione predefinita, Pandas Series.std() usa la deviazione standard campionaria (ddof=1); usa ddof=0 se il calcolo richiede la deviazione standard della popolazione.
import pandas as pd
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
mean_norm = df.apply(lambda column: (column - column.mean()) / column.std(), axis=0)
print(mean_norm.round(3))
A B C D
0 -1.162 -1.162 1.162 NaN
1 -0.387 -0.387 -1.162 NaN
2 0.387 0.387 0.387 NaN
3 1.162 1.162 -0.387 NaN
Questa trasformazione è utile quando un metodo trae vantaggio da scale centrate e comparabili. In una colonna costante la deviazione standard è zero, quindi la formula produce valori mancanti per quella colonna; in base all’applicazione, valuta se eliminare la variabile o gestirla separatamente.
Normalizzare un DataFrame Pandas con la normalizzazione min-max
Per ogni colonna, la scalatura min-max usa la formula (x - min) / (max - min). Il minimo e il massimo di ogni colonna non costante diventano rispettivamente 0 e 1, mentre gli altri valori si distribuiscono proporzionalmente tra questi estremi. La funzione di supporto qui sotto usa sempre l’argomento df_input e assegna 0 a una colonna costante: è una scelta neutra comune quando una variabile non presenta variazioni.
import pandas as pd
def minmax_norm(df_input):
column_range = df_input.max() - df_input.min()
scaled = (df_input - df_input.min()) / column_range
return scaled.fillna(0)
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
print(minmax_norm(df).round(3))
A B C D
0 0.000 0.000 1.000 0.0
1 0.333 0.333 0.000 0.0
2 0.667 0.667 0.667 0.0
3 1.000 1.000 0.333 0.0
La scalatura min-max è adatta quando serve un intervallo fisso. Poiché la scala dipende dal minimo e dal massimo osservati, un valore estremo può comprimere gli altri valori della colonna in un intervallo ristretto. Il fillna(0) finale della funzione assegna 0 alle colonne numeriche costanti, ma sostituisce con 0 anche tutti i valori mancanti già presenti nell’input. Se preferisci imputare i valori mancanti con la media, puoi farlo prima di chiamare la funzione, per esempio con minmax_norm(df_input.fillna(df_input.mean())); scegli una strategia di imputazione adatta ai tuoi dati.
Normalizzare un DataFrame Pandas con la normalizzazione per quantile
La normalizzazione per quantili è utile quando ci si aspetta che le colonne condividano la stessa distribuzione sottostante. Ordina i valori di ciascuna colonna, calcola la media dei valori ordinati che occupano lo stesso rango fra le colonne e poi riporta queste medie di rango alle righe originali. A differenza degli altri due metodi, modifica i valori per allineare le distribuzioni empiriche delle colonne: usala solo se l’ipotesi di una distribuzione condivisa è appropriata.
Questa implementazione usa rank(method="min"): ai valori a pari merito viene assegnato il rango minimo del gruppo. I ranghi a pari merito non vengono mediati, quindi i pareggi possono far sì che le distribuzioni risultanti differiscano. Nell’esempio condiviso, la colonna D è costante: tutti e quattro i valori hanno il rango minimo e vengono quindi associati alla stessa media di rango, invece di coprire i diversi ranghi condivisi.
import numpy as np
import pandas as pd
def quantile_norm(df_input):
sorted_values = np.sort(df_input.to_numpy(), axis=0)
rank_means = sorted_values.mean(axis=1)
rank_to_mean = pd.Series(rank_means, index=np.arange(1, len(rank_means) + 1))
ranks = df_input.rank(method="min").stack().astype(int)
return ranks.map(rank_to_mean).unstack()
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [10, 20, 30, 40],
"C": [4, 1, 3, 2],
"D": [5, 5, 5, 5],
})
print(quantile_norm(df).round(3))
A B C D
0 4.25 4.25 13.25 4.25
1 7.25 7.25 4.25 4.25
2 10.25 10.25 10.25 4.25
3 13.25 13.25 7.25 4.25
La colonna costante D mostra perché è importante l’ipotesi di distribuzione condivisa: i suoi valori ripetuti ricevono tutti il rango minimo e vengono mappati a 4.25, perciò la distribuzione empirica della colonna non coincide con quella delle altre. Per le normali variabili numeriche, scegli in base all’obiettivo: gli z-score per centrare i valori e scalarli in base alla deviazione standard, la scalatura min-max per ottenere un intervallo delimitato tenendo conto dei valori anomali, oppure la normalizzazione per quantili quando i dati giustificano l’allineamento delle distribuzioni delle colonne.