Eliminación de columnas de un DataFrame en Python según el porcentaje de NaNs

El análisis y limpieza de valores faltantes (NaNs) es una tarea muy común antes de comenzar a trabajar con un conjunto de datos. Si bien eliminar filas que contengan algún NaN con df.dropna() es sencillo, en ocasiones es más útil analizar y limpiar los valores nulos por columnas. Esto es especialmente importante cuando se dispone de un alto número de atributos y queremos detectar aquellas variables que tienen muchos datos faltantes, ya que podrían no aportar información relevante.

En este post veremos cómo:

  1. Calcular el porcentaje de NaNs en cada columna.
  2. Eliminar de forma automática las columnas que tengan un porcentaje de NaNs igual o superior al 20% (por ejemplo).
  3. Rellenar los NaNs restantes con el valor anterior de la columna (forward fill).

1. Creación del dataset de ejemplo

Partimos de un DataFrame ficticio con 29 filas y 7 columnas. Para simular valores faltantes, usaremos la función np.random.choice y definiremos probabilidades para que algunas columnas tengan mayor cantidad de NaNs.

import pandas as pd
import numpy as np

# Fijamos la semilla para reproducibilidad
np.random.seed(42)

# Creamos un dataset ficticio con 29 filas y 7 columnas (A, B, C, D, E, F, G)
data = {
'A': np.random.choice([1, 2, 3, np.nan], size=29, p=[0.3, 0.3, 0.3, 0.1]),
'B': np.random.choice([4, 5, 6, np.nan], size=29, p=[0.2, 0.2, 0.2, 0.4]),
'C': np.random.choice([7, 8, 9, np.nan], size=29, p=[0.33, 0.33, 0.33, 0.01]),
'D': np.random.choice([10, 11, 12, np.nan], size=29, p=[0.25, 0.25, 0.25, 0.25]),
'E': np.random.choice([13, 14, 15, np.nan], size=29, p=[0.3, 0.3, 0.3, 0.1]),
'F': np.random.choice([16, 17, 18, np.nan], size=29, p=[0.1, 0.1, 0.1, 0.7]),
'G': np.random.choice([19, 20, 21, np.nan], size=29, p=[0.4, 0.4, 0.19, 0.01])
}

df = pd.DataFrame(data)
print("DataFrame original:")
print(df)

2. Análisis y eliminación de columnas con alto porcentaje de NaNs

Primero calculamos el porcentaje de valores nulos en cada columna. Con df.isna().mean() obtenemos la fracción de NaNs por columna. Luego, determinamos cuáles columnas tienen un porcentaje mayor o igual al 20% y procedemos a eliminarlas:

# Calcular el porcentaje de NaNs en cada columna
porcentaje_nulls = df.isna().mean()
print("\nPorcentaje de valores NaN por columna:")
print(porcentaje_nulls)

# Identificar las columnas con >= 20% de NaNs
cols_eliminar = porcentaje_nulls[porcentaje_nulls >= 0.20].index
print("\nColumnas a eliminar (>= 20% NaNs):")
print(list(cols_eliminar))

# Eliminar las columnas identificadas
df_limpio = df.drop(columns=cols_eliminar)
print("\nDataFrame tras eliminar columnas con >= 20% NaNs:")
print(df_limpio)

Nota: En este ejemplo, dependiendo de los datos generados aleatoriamente, es posible que algunas columnas cumplan el criterio para ser eliminadas.

3. Rellenar los NaNs restantes con el valor anterior (forward fill)

Para evitar dejar huecos en los datos, rellenamos los NaNs restantes con el valor anterior de cada columna utilizando la función fillna(method='ffill'). Esto es especialmente útil cuando los datos siguen una secuencia en la que el valor anterior es representativo:

# Rellenar los NaNs restantes con el valor anterior de la columna
df_final = df_limpio.fillna(method='ffill')
print("\nDataFrame final tras rellenar NaNs con el valor anterior:")
print(df_final)

Conclusión

En este post hemos visto cómo realizar un análisis por columnas para identificar aquellas que tienen un alto porcentaje de valores nulos y eliminarlas de forma automática. Además, hemos rellenado los NaNs restantes con el valor anterior en cada columna para mantener la continuidad de los datos.

Este proceso es muy útil para preprocesar datasets antes de realizar análisis o entrenar modelos de machine learning, ya que permite limpiar la información y evitar problemas derivados de datos incompletos.

¡Espero que te sea de ayuda!

Para saber más:
Cálculo del ratio de NaN en cada columna de un dataframe
app para conocer gente nueva
citas en linea metlife

Deja una respuesta