Cómo rellenar valores nulos con la media de cada columna

| | , ,

Vamos a ver cómo rellenar los valores faltantes o nulos (NaN) de cada columna de un dataframe, reemplazándolos con la media de la columna correspondiente. Como siempre, hay muchísimas maneras distintas de hacer esto en Python, así que echaremos un vistazo a las principales opciones y evaluaremos también el tiempo de ejecución de cada una de ellas.

1. Descarga de datos de ejemplo

Para llevar a cabo este ejercicio, podemos descargarnos unos datos de ejemplo del repositorio de Machine Learning UCI. Concretamente, trabajaremos con el Dow Jones Index Data Set, cargándolo para ello en un dataframe de pandas:

import pandas as pd
df = pd.read_csv("dow_jones_index.data")
df.head()

Si ejecutas el código anterior, deberías ver una salida como esta:

python-valores-faltantes-1

Fíjate en la primera fila (la de índice 0): ya vemos dos valores faltantes, que se muestran con las siglas NaN. Vamos a calcular exactamente cuántas filas de nuestro dataframe tienen valores nulos:

len(df[df.isnull().any(axis=1)])

La salida del código anterior nos indica que hay 30 filas que tienen, como mínimo, un valor faltante. Además, puedes ejecutar el siguiente código en un editor para ver en qué columnas se encuentran esos valores nulos:

df.isna().sum()

Verás algo como esto:

python-valores-faltantes-media-5

Tenemos, por tanto, 30 valores faltantes en la columna “percent_change_volume_over_last_wk” y otros 30 en “previous_weeks_volume”, ambas de tipo numérico:

df.dtypes
python-valores-faltantes-media-6

¿Cómo podemos rellenar esos valores con la media de sus respectivas columnas?

2. Cálculo de la media de cada columna

Con el fin de contrastar los resultados que obtengamos más adelante, vamos a calcular ahora la media de cada columna, ignorando de momento los valores faltantes que haya:

df.mean()

Si ejecutas el código anterior en tu editor, deberías ver una salida como esta:

python-valores-faltantes-2

Ahora que ya conocemos la media de cada columna de tipo numérico, vamos a ver qué opciones hay para rellenar los NaN de cada columna con la media de dicha columna.

3. Relleno de valores faltantes con la media de cada columna

¡Ojo! Solo podemos rellenar los valores faltantes con la media de una columna si dicha columna es de tipo numérico, así que es importante tener esto en cuenta a la hora de escoger el método de relleno. Si también hubiésemos encontrado valores faltantes en columnas de tipo object, tendríamos que realizar de forma independiente el relleno de NaN en dichas columnas, utilizando otros métodos válidos para columnas de tipo no numérico.

Opción 1: función lambda

from pandas.api.types import is_numeric_dtype
df = df.apply(lambda x: x.fillna(x.mean()) if is_numeric_dtype(x) else x)
df.head()

De esta manera, evaluamos si una columna es de tipo numérico y, si es así, rellenamos los valores faltantes con la media de dicha columna. El resto de valores de la columna se mantienen tal cual están.

La salida del código anterior debería ser la siguiente:

python-valores-faltantes-media-4

Si comparas los nuevo valores que hay ahora, donde antes había NaN, podrás ver que coinciden perfectamente con los de las medias que calculamos en el punto anterior. Además, el tiempo de ejecución es de 0 ns, así que para este volumen de datos el método aplicado devuelve el resultado de manera prácticamente instantánea.

Opción 2: aplicación directa del método fillna()

%time
df = df.fillna(df.mean())
df.head()

La salida, como era de esperar, es idéntica a la del caso anterior:

python-valores-faltantes-media-4

Tampoco hemos obtenido ninguna diferencia en cuanto al tiempo de ejecución.

4. Conclusiones

Hemos comprobado que, para este volumen de datos (750 filas × 16 columnas), los resultados son idénticos para ambos métodos, puesto que no existe una diferencia apreciable en cuanto al tiempo de ejecución. En cuanto a la sintaxis, es más sencilla la de la segunda opción, que además no requiere importar ningún módulo adicional. ¿Cuál prefieres? ¿Se te ocurre alguna más?

Si quieres aprender más sobre relleno de valores faltantes, quizás te interese echarle un ojo a mi curso de Data Science, en el que dedicamos varias clases a este tema:

valores-faltantes-python

Keep learning!

Anterior

Stateful Widget, el que cambia

Coronavirus: más detalles, gracias al Machine Learning

Siguiente

Deja un comentario