Normalizar una columna en Pandas Dataframe

Sathiya Sarathi 10 octubre 2023
  1. Normalización de datos en Pandas
  2. Normalizar el Dataframe de los Pandas con la media normalización
  3. Normalizar la estructura de datos de los pandas con la normalización min-max
  4. Normalizar Pandas DataFrame con la normalización de cuantiles
Normalizar una columna en Pandas Dataframe

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.

Normalización media - Antes de la normalización

# %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.

Normalización media - Después de la normalización

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")

Normalización Mín-Máx - Después de la normalización

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:

  1. Ordenación de los valores dentro de cada columna (Ranking)
  2. Promedio a través de cada fila y reemplazar el valor de cada elemento de la fila con el promedio
  3. 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.

Normalización del Cuadrante - Después de la Normalización

Artículo relacionado - Pandas DataFrame

Artículo relacionado - Pandas DataFrame Column