Normalizza una colonna in Pandas Dataframe
- Normalizzazione dei dati in Pandas
-
Normalizza il dataframe di Pandas con la normalizzazione
media
-
Normalizza il dataframe di Pandas con la normalizzazione
min-max
-
Normalizza il dataframe di Pandas con la normalizzazione
quantile
La standardizzazione o la normalizzazione dei dati è la fase iniziale dell’ingegneria delle caratteristiche. La normalizzazione delle colonne comporterà il portare i valori delle colonne su una scala comune, per lo più eseguita per colonne con intervalli variabili. In Pandas, le colonne di Dataframe possono essere normalizzate da una varietà di funzioni. Questo articolo ti aiuterà a mettere in pratica queste funzioni e ad applicare le funzioni nelle giuste situazioni.
Normalizzazione dei dati in Pandas
Esistono due metodi di normalizzazione dei dati più utilizzati.
- Normalizzazione media
- Normalizzazione min-max
- Normalizzazione quantile
Non sono disponibili metodi specifici in Pandas per eseguire la normalizzazione dei dati. Spiegheremo cosa sono queste normalizzazioni e come possono essere implementate utilizzando Pandas nativi e un po’ di tocco dalle funzioni native di Python.
Useremo il seguente frammento ovunque per creare un dataframe con elementi casuali come di seguito.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))
print(df)
Restituirà un dataframe simile a quello indicato di seguito.
A B C D
0 72 -53 17 92
1 -33 95 3 -91
2 -79 -64 -13 -30
3 -12 40 -42 93
4 -61 -13 74 -12
5 -19 65 -75 -23
6 -28 -91 48 15
7 97 -21 75 92
8 -18 -1 77 -71
9 47 47 42 67
10 -68 93 -91 85
11 27 -68 -69 51
12 63 14 83 -72
13 -66 28 28 64
14 -47 33 -62 -83
15 -21 32 5 -58
16 86 -69 20 -99
17 -35 69 -43 -65
18 2 19 -89 74
19 -18 -9 28 42
[20 rows x 4 columns]
Normalizza il dataframe di Pandas con la normalizzazione media
La normalizzazione media
è uno dei modi più semplici per normalizzare i dataframe di intervalli diversi. La normalizzazione viene eseguita sottraendo la media e dividendo per la deviazione standard per tutti gli elementi del dataframe.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))
def mean_norm(df_input):
return df_input.apply(lambda x: (x - x.mean()) / x.std(), axis=0)
df_mean_norm = mean_norm(df)
print(df_mean_norm)
Produzione:
A B C D
0 1.452954 -1.090261 0.278088 1.247208
1 -0.514295 1.585670 0.037765 -1.333223
2 -1.376137 -1.289148 -0.236890 -0.473079
3 -0.120845 0.591236 -0.734701 1.261309
4 -1.038895 -0.367037 1.256545 -0.219266
5 -0.251995 1.043252 -1.301176 -0.374374
6 -0.420617 -1.777325 0.810231 0.161453
7 1.921346 -0.511681 1.273711 1.247208
8 -0.233260 -0.150069 1.308043 -1.051208
9 0.984561 0.717801 0.707236 0.894690
10 -1.170045 1.549509 -1.575831 1.148503
11 0.609847 -1.361470 -1.198181 0.669079
12 1.284333 0.121140 1.411038 -1.065309
13 -1.132573 0.374269 0.466913 0.852388
14 -0.776595 0.464672 -1.078020 -1.220417
15 -0.289467 0.446591 0.072097 -0.867899
16 1.715254 -1.379551 0.329586 -1.446028
17 -0.551766 1.115574 -0.751867 -0.966604
18 0.141455 0.211543 -1.541499 0.993395
19 -0.233260 -0.294714 0.466913 0.542172
Se stai usando un notebook Jupyter, entrambi i Dataframe possono essere visualizzati usando Matplotlib, come mostrato nel codice sottostante.
# %matplotlib inline
df["A"].plot(kind="bar")
Selezionando la colonna A
del dataframe prima della normalizzazione e visualizzando un grafico a barre al di fuori di esso, notare che l’asse y contiene valori compresi tra -100 e 100.
# %matplotlib inline
df_mean_norm["A"].plot(kind="bar")
La figura seguente mostra la normalizzazione dei dati post; quando viene visualizzata la stessa colonna, l’asse y è compreso tra -1,5 e +1,5.
Normalizza il dataframe di Pandas con la normalizzazione min-max
Questo è uno dei metodi ampiamente utilizzati per la normalizzazione. L’output di normalizzazione sottrae il valore minimo di un dataframe e lo divide per la differenza tra il valore più alto e quello più basso della colonna corrispondente.
import pandas as pd
import numpy as np
np.random.seed(0)
df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))
def minmax_norm(df_input):
return (df - df.min()) / (df.max() - df.min())
df_minmax_norm = minmax_norm(df)
print(df_minmax_norm)
Produzione:
A B C D
0 0.857955 0.204301 0.620690 0.994792
1 0.261364 1.000000 0.540230 0.041667
2 0.000000 0.145161 0.448276 0.359375
3 0.380682 0.704301 0.281609 1.000000
4 0.102273 0.419355 0.948276 0.453125
5 0.340909 0.838710 0.091954 0.395833
6 0.289773 0.000000 0.798851 0.593750
7 1.000000 0.376344 0.954023 0.994792
8 0.346591 0.483871 0.965517 0.145833
9 0.715909 0.741935 0.764368 0.864583
10 0.062500 0.989247 0.000000 0.958333
11 0.602273 0.123656 0.126437 0.781250
12 0.806818 0.564516 1.000000 0.140625
13 0.073864 0.639785 0.683908 0.848958
14 0.181818 0.666667 0.166667 0.083333
15 0.329545 0.661290 0.551724 0.213542
16 0.937500 0.118280 0.637931 0.000000
17 0.250000 0.860215 0.275862 0.177083
18 0.460227 0.591398 0.011494 0.901042
19 0.346591 0.440860 0.683908 0.734375
Nell’output precedente, possiamo dedurre che il valore minimo di ogni colonna viene trasformato in 0
e il valore massimo in ogni colonna viene trasformato in 1
.
Viene visualizzata la colonna A
per questa normalizzazione, come mostrato di seguito.
# %matplotlib inline
df_minmax_norm["A"].plot(kind="bar")
Sebbene ciò valga per i dataframe a distanza ravvicinata, la normalizzazione MinMax potrebbe non essere adatta per i dataframe con molti valori anomali.
Normalizza il dataframe di Pandas con la normalizzazione quantile
La normalizzazione quantile viene utilizzata nel caso di analisi di dati ad alta dimensione. Osserva e presume che la distribuzione statistica di ogni colonna sia la stessa. La normalizzazione quantile consiste nei seguenti passaggi:
- Valori dell’ordine all’interno di ciascuna colonna (ranking)
- Media su ogni riga e sostituire il valore di ogni elemento nella riga con la media
- Riordinare i valori nell’ordine originale come inizialmente.
import numpy as np
import pandas as pd
np.random.seed(0)
df = pd.DataFrame(np.random.randint(-100, 100, size=(20, 4)), columns=list("ABCD"))
def quantile_norm(df_input):
sorted_df = pd.DataFrame(
np.sort(df_input.values, axis=0), index=df_input.index, columns=df_input.columns
)
mean_df = sorted_df.mean(axis=1)
mean_df.index = np.arange(1, len(mean_df) + 1)
quantile_df = df_input.rank(method="min").stack().astype(int).map(mean_df).unstack()
return quantile_df
df_quantile_norm = quantile_norm(df)
print(df_quantile_norm)
Produzione:
A B C D
0 77.00 -58.25 8.25 77.00
1 -36.50 92.00 -10.50 -79.25
2 -90.00 -66.50 -20.00 -20.00
3 24.75 44.00 -36.50 92.00
4 -66.50 -36.50 71.75 -3.00
5 -3.00 71.75 -73.00 -10.50
6 -20.00 -90.00 54.00 8.25
7 92.00 -41.00 77.00 77.00
8 8.25 -10.50 87.00 -58.25
9 54.00 54.00 44.00 44.00
10 -79.25 87.00 -90.00 71.75
11 44.00 -73.00 -66.50 24.75
12 71.75 -3.00 92.00 -66.50
13 -73.00 18.00 24.75 31.75
14 -58.25 31.75 -58.25 -73.00
15 -10.50 24.75 -3.00 -36.50
16 87.00 -79.25 18.00 -90.00
17 -41.00 77.00 -41.00 -41.00
18 31.75 8.25 -79.25 54.00
19 8.25 -20.00 24.75 18.00
L’output per la normalizzazione quantile può essere visualizzato per la colonna A come mostrato di seguito.
Articolo correlato - Pandas DataFrame
- Come ottenere le intestazioni delle colonne DataFrame Pandas come lista
- Come cancellare la colonna DataFrame Pandas DataFrame
- Come convertire la colonna DataFrame in data e ora in pandas
- Converti un Float in un Integer in Pandas DataFrame
- Ordina Pandas DataFrame in base ai valori di una colonna
- Ottieni l'aggregato di Pandas Group-By e Sum
Articolo correlato - Pandas DataFrame Column
- Come ottenere le intestazioni delle colonne DataFrame Pandas come lista
- Come cancellare la colonna DataFrame Pandas DataFrame
- Come convertire la colonna DataFrame in data e ora in pandas
- Ottieni la colonna della somma dei pandas
- Modificare l'ordine delle colonne DataFrame di Pandas
- Converti colonna DataFrame in stringa in Pandas