Normalizar una columna en Pandas Dataframe
- Normalización de datos en Pandas
-
Normalizar el Dataframe de los Pandas con la
media
normalización -
Normalizar la estructura de datos de los pandas con la normalización
min-max
- Normalizar Pandas DataFrame con la normalización de cuantiles
La estandarización o normalización de los datos es el paso inicial de la ingeniería de características. La normalización de las columnas implicará llevar los valores de las columnas a una escala común, lo que se hace principalmente para las columnas con rangos variados. En Pandas, las columnas de los Dataframes pueden ser normalizadas por una variedad de funciones. Este artículo te ayudará a practicar estas funciones y a aplicarlas en las situaciones adecuadas.
Normalización de datos en Pandas
Hay dos métodos de normalización de datos más utilizados.
- Normalización media
- Normalización Min-Max
- Normalización de cuantiles
No hay ningún método específico disponible en Pandas para llevar a cabo la normalización de los datos. Explicaremos cuáles son estas normalizaciones y cómo se pueden implementar usando Pandas nativos y un poco de tacto de las funciones Python nativas.
Utilizaremos el siguiente fragmento en todas partes para crear Dataframe con elementos aleatorios como el que se muestra a continuación.
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)
Devolverá Dataframe similar al que se muestra a continuación.
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]
Normalizar el Dataframe de los Pandas con la media
normalización
La normalización media es una de las formas más fáciles de normalizar los Dataframes de rangos variados. La normalización se hace restando la media y dividiendo por la desviación estándar para todos los elementos 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)
Resultado:
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
Si se utiliza un cuaderno Jupyter, ambos Dataframes pueden ser visualizados utilizando Matplotlib, como se muestra en el siguiente código.
# %matplotlib inline
df["A"].plot(kind="bar")
Seleccionando la columna A
del dataframe antes de la normalización y visualizando un gráfico de barras fuera de él, note que el eje y contiene valores en el rango -100 a 100.
# %matplotlib inline
df_mean_norm["A"].plot(kind="bar")
La siguiente figura muestra los datos después de la normalización; cuando se visualiza la misma columna, el eje y se encuentra en el rango de -1,5 a +1,5.
Normalizar la estructura de datos de los pandas con la normalización min-max
Este es uno de los métodos ampliamente utilizados para la normalización. El resultado de la normalización resta el valor mínimo de Dataframe y lo divide por la diferencia entre el valor más alto y el más bajo de la columna correspondiente.
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)
Resultado:
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
En la salida anterior, podemos inferir que el valor mínimo de cada columna se transforma en 0
, y el valor máximo de cada columna se transforma en 1
.
La columna A
para esta normalización se visualiza, como se muestra a continuación.
# %matplotlib inline
df_minmax_norm["A"].plot(kind="bar")
Aunque esto es válido para los Dataframes de corto alcance, la normalización MinMax puede no ser adecuada para los Dataframes con muchos valores atípicos.
Normalizar Pandas DataFrame con la normalización de cuantiles
La normalización de las cantidades se utiliza en el caso de los análisis de datos de alta dimensión. Observa y asume que la distribución estadística de cada columna es la misma. La normalización de los cuantiles consiste en los siguientes pasos:
- Ordenación de los valores dentro de cada columna (Ranking)
- Promedio a través de cada fila y reemplazar el valor de cada elemento de la fila con el promedio
- Reordenar los valores al orden original como inicialmente.
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)
Resultado:
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
La salida para la normalización del cuantil puede visualizarse para la columna A como se muestra a continuación.
Artículo relacionado - Pandas DataFrame
- Cómo obtener las cabeceras de columna de Pandas DataFrame como una lista
- Cómo borrar la columna de Pandas DataFrame
- Cómo convertir la columna del DataFrame a Datetime en Pandas
- Cómo convertir un float en un entero en Pandas DataFrame
- Cómo clasificar Pandas DataFrame por los valores de una columna
- Cómo obtener el agregado de Pandas grupo por y suma
Artículo relacionado - Pandas DataFrame Column
- Cómo obtener las cabeceras de columna de Pandas DataFrame como una lista
- Cómo borrar la columna de Pandas DataFrame
- Cómo convertir la columna del DataFrame a Datetime en Pandas
- Cómo obtener la suma de la columna de Pandas
- Cómo cambiar el orden de las columnas Pandas DataFrame
- Cómo convertir la columna del DataFrame en cadena en los pandas