Saltar al contenido

# manejo-de-datos-en-pandas

Manejo de datos en Pandas

Volver a la portada del curso
Notebook

Tratamiento de datos faltantes

Sección 4 · Manipulación y limpieza de datos

Tratamiento de datos faltantes

Casi ningún archivo real llega completo. En el CSV de pedidos de PyShop faltan cantidades, precios y calificaciones, y algunas fechas son imposibles. El reflejo de borrar toda fila incompleta parece prudente, pero aquí eliminaría 418 de 1000 pedidos. Esta guía acompaña al notebook datos-faltantes, que primero deja los tipos correctos y después decide, columna por columna, qué hacer con cada hueco. La idea central: no hay una regla única; se borra, se rellena o se deja vacío según lo que significa el dato.

1. Antes de medir: tipos correctos

Los nulos solo se cuentan bien cuando cada columna tiene su tipo. El notebook arranca con la limpieza de la lección 442: quita las 25 filas repetidas, normaliza las ciudades y convierte precio y fecha. Este último paso revela faltantes ocultos: «2025-02-30» es texto válido, pero no una fecha. pd.to_datetime sin más lanza ValueError; con errors="coerce" convierte cada fecha imposible en NaT, el nulo de las fechas.

c["fecha"] = pd.to_datetime(c["fecha"], errors="coerce")
print(int(c["fecha"].isna().sum()))   # 9

2. Medir: cuántos y dónde

isna().sum() cuenta los nulos y isna().mean() da la proporción (cada True vale 1). Sobre los 1000 pedidos sin duplicados:

ColumnaNulos%
fecha90.9
cantidad414.1
precio_unitario212.1
calificacion37437.4

3. Borrar: dropna y cuánto cuesta

dropna() sin argumentos borra cualquier fila con al menos un nulo y deja 582 pedidos. Casi todo lo perdido son pedidos con precio y cantidad perfectos a los que solo les faltaba la calificación. Dos formas de ser selectivo:

  • dropna(subset=["cantidad", "precio_unitario"]) solo mira esas columnas: quedan 939.
  • dropna(thresh=9) conserva las filas con al menos 9 valores no nulos: quedan 974.

Borrar sí es la decisión correcta para las fechas imposibles: no hay forma de reconstruirlas. Se hace con dropna(subset=["fecha"]).

4. Rellenar con criterio: fillna

Cantidad. La mayoría de los pedidos son de 1 unidad. La mediana (1.0) y la moda (1.0) representan el pedido típico; la media (1.776) está inflada por los pocos pedidos de 4 o 5 unidades. Se rellena con la mediana.

Precio. Una mediana global mezclaría un monitor con una playera. Cada producto tiene su precio, así que el hueco se rellena con la mediana del mismo producto. transform devuelve una Series del mismo largo que el DataFrame, alineada fila por fila:

mediana = c.groupby("producto")["precio_unitario"].transform("median")
c["precio_unitario"] = c["precio_unitario"].fillna(mediana)
c["cantidad"] = c["cantidad"].fillna(c["cantidad"].median())

Tras estas dos líneas, cantidad y precio quedan sin nulos.

5. Cuándo no rellenar: la calificación

Solo los pedidos entregados pueden calificarse; en los otros estados la calificación falta siempre. Ese faltante es estructural: significa «no aplica», no «se perdió». Entre los entregados faltan 99 de 725 (clientes que no calificaron). Rellenar con 0 inventaría clientes muy insatisfechos: la media de los entregados bajaría de 4.01 a 3.46. Lo correcto es dejar el NaN, que mean() ignora.

6. NaN, NaT y pd.NA

  • NaN es el nulo de los números float64; por eso una columna de enteros con huecos se lee como decimal.
  • NaT es el nulo de las fechas.
  • pd.NA es el nulo de los tipos que admiten faltantes, como Int64 (con I mayúscula): enteros con huecos.

En una serie ordenada, interpolate() estima el hueco con los vecinos ([1, 2, None, 4] pasa a [1, 2, 3, 4]) y ffill() copia el último valor conocido ([1, 2, 2, 4]). Tienen sentido en series de tiempo, no en la cantidad de pedidos independientes.

7. Ejercicios del notebook

Cuatro funciones con pruebas: el porcentaje de nulos por columna, cuántas filas borra dropna(), rellenar el precio por producto sin modificar el original y la media de calificación sin rellenar. Las soluciones están al final.

Trampas comunes

  • Medir antes de convertir tipos. Las fechas imposibles no cuentan como nulas mientras sean texto.
  • dropna() sin argumentos. Revisa siempre cuántas filas quedan.
  • Rellenar con la media una variable asimétrica. La mediana resiste a los valores extremos.
  • Rellenar lo que no aplica. Un faltante estructural se deja vacío.
  • Olvidar el map. Un valor que no está en el diccionario se convierte en NaN sin aviso.

Antes de tratar un faltante, pregunta por qué falta. La respuesta decide entre borrar, rellenar o dejarlo.

Recursos