QuieroProgramar por Rodri Gonzalez
Data Analysis · Lección 05 de 19

pandas: Limpieza de Datos

En el mundo de fantasía, los datos llegan perfectos. En el mundo real, llegan sucios, incompletos, duplicados y llenos de formatos inconsistentes. La limpieza consume el 60-80% del tiempo de un Data Analyst. Si no limpiás, tu análisis es basura — "garbage in, garbage out".

90–120 min Prerrequisitos: Lección 04 (Selección y filtrado)
01

Concepto teórico

Los 4 jinetes del caos en datos

Casi todos los problemas de calidad de datos en tu carrera van a caer en estas cuatro categorías:

Problema Ejemplo real Herramienta pandas
Valores nulos (NaN) Cliente sin email, saldo sin informar isna(), fillna(), dropna()
Duplicados Mismo cliente cargado 2 veces duplicated(), drop_duplicates()
Tipos incorrectos Saldo guardado como texto "150000" astype(), pd.to_numeric()
Strings sucios " GARCÍA " vs "garcía" vs "Garcia" .str.strip(), .str.lower(), .str.replace()
Analogía del restaurant: Antes de cocinar (analizar), el chef lava y pela los vegetales (limpia los datos). Si no lo hacés, la comida sale con tierra y cáscaras. Lo mismo con los datos: si un campo "Monto" tiene el símbolo "$" como texto, pandas no puede sumar. Necesitás limpiar primero.

NaN: El fantasma de pandas

NaN (Not a Number) es la representación universal de "dato faltante" en pandas. Viene del módulo numpy. Tiene un comportamiento especial que causa bugs silenciosos si no lo conocés:

El bug silencioso más peligroso: si calculás un promedio y tu columna tiene NaN, pandas los ignora automáticamente en .mean(). Esto puede ser bueno o malo: si el 40% de tus datos son nulos, tu promedio se basa en el 60% restante y puede no ser representativo. Siempre revisá isna().sum() antes de calcular estadísticas.

Estrategias para manejar nulos

Estrategia Método Cuándo usarla
Eliminar filas df.dropna() Pocos nulos, perder filas es aceptable
Rellenar con valor fijo df.fillna(0) Nulo significa "cero" (ej: ventas sin registrar)
Rellenar con estadístico df.fillna(df.mean()) Preservar la distribución general
Rellenar con el anterior df.ffill() Series temporales (usar último valor conocido)
En el trabajo real: la decisión de "eliminar vs rellenar" la toman juntos el analista y el área de negocios. No es una decisión técnica pura. Si un banco elimina clientes sin email, puede estar tirando el segmento de adultos mayores que no usan email pero tienen saldos altísimos. Siempre documentá tu decisión.
02

Ejemplos explicados paso a paso

Ejemplo 1: Detectar y contar nulos

Antes de limpiar, necesitás un diagnóstico. isna() te muestra dónde están los huecos.

ejemplo_01_detectar.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 2: Eliminar vs rellenar nulos

Las dos estrategias principales y cuándo usar cada una.

ejemplo_02_limpiar_nulos.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 3: Eliminar duplicados

Los duplicados engañan tus métricas. Si un cliente aparece 3 veces, tu conteo de clientes está inflado un 200%. Detectálos y eliminá los sobrantes.

ejemplo_03_duplicados.pyPython

        
Hacé clic en ▶ Ejecutar

Ejemplo 4: Corregir tipos de datos

Un clásico: el campo "Saldo" vino como texto porque el CSV lo exportaron mal. Si no convertís, sum() concatena strings en vez de sumar números.

ejemplo_04_tipos.pyPython

        
Hacé clic en ▶ Ejecutar
Tip profesional: siempre revisá df.dtypes inmediatamente después de importar un CSV. Si una columna numérica dice object, significa que pandas la interpretó como texto. Significa que hay algún caracter extraño en alguna fila que impidió la conversión automática.

Ejemplo 5: Limpiar strings sucios

Los nombres de ciudades escritos de 10 formas distintas son el dolor de cabeza de todo analista. El accessor .str de pandas permite operaciones de limpieza vectorizadas sobre columnas de texto.

ejemplo_05_strings.pyPython

        
Hacé clic en ▶ Ejecutar
03

Referencia rápida

Método Qué hace Modifica el original?
df.isna() Máscara True donde hay NaN No (devuelve nuevo)
df.isna().sum() Cuenta nulos por columna No
df.dropna() Elimina filas con nulos No (devuelve nuevo)
df.fillna(valor) Reemplaza NaN con valor No (devuelve nuevo)
df.duplicated() Máscara True en duplicados No
df.drop_duplicates() Elimina filas repetidas No (devuelve nuevo)
df["col"].astype(tipo) Convierte tipo de dato No (devuelve nuevo)
df["col"].str.strip() Elimina espacios extremos No (devuelve nuevo)
df["col"].str.upper() Todo a mayúsculas No (devuelve nuevo)
df["col"].str.replace() Reemplaza texto No (devuelve nuevo)
04

Ejercicios

Nivel 1 · Básico

Ejercicio 1: Contar nulos

El dataset tiene valores faltantes. Usá .isna().sum() para contar cuántos nulos hay por columna. El output debe incluir el número 2 (la columna Email tiene 2 nulos).

ejercicio_01.pyDebe incluir "2"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 2: Eliminar filas con nulos

Usá .dropna() para quedarte solo con filas completas. Imprimí cuántas filas quedan usando len(). Deben quedar 2.

ejercicio_02.pyDebe incluir "2"

          
Hacé clic en ▶ Ejecutar
Nivel 1 · Básico

Ejercicio 3: Rellenar nulos con cero

La columna Saldo tiene un NaN. Rellenalo con 0 usando fillna() e imprimí la suma total de saldos. Debe dar 1600.

ejercicio_03.pyDebe incluir "1600"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 4: Detectar y contar duplicados

El dataset tiene clientes repetidos. Usá .duplicated().sum() para contar cuántos duplicados hay. Debe dar 2.

ejercicio_04.pyDebe incluir "2"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 5: Eliminar duplicados por columna clave

Eliminá duplicados basándote en la columna "DNI", quedándote con la primera aparición. Imprimí cuántas filas únicas quedan. Deben ser 3.

ejercicio_05.pyDebe incluir "3"

          
Hacé clic en ▶ Ejecutar
Nivel 2 · Intermedio

Ejercicio 6: Convertir tipo de dato

La columna "Monto" es un string. Convertila a int con astype() e imprimí la suma. Debe dar 2850.

ejercicio_06.pyDebe incluir "2850"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 7: Limpiar strings con strip y upper

Las ciudades se cargaron con inconsistencias de mayúsculas y espacios. Limpiá la columna usando .str.strip().str.upper(). Luego contá cuántos son "CABA". Debe dar 3.

ejercicio_07.pyDebe incluir "3"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 8: Limpiar montos con símbolos

Los montos tienen $ y ,. Limpiálos y convertílos a float, luego imprimí el total. Debe dar 6470.5.

ejercicio_08.pyDebe incluir "6470.5"

          
Hacé clic en ▶ Ejecutar
Nivel 3 · Avanzado

Ejercicio 9: Pipeline de limpieza completo

El dataset tiene nulos en Saldo y duplicados por DNI. Primero rellenálos con la media, después eliminá duplicados. Imprimí la suma final de saldos. Debe incluir 1520000.

ejercicio_09.pyDebe incluir "1520000"

          
Hacé clic en ▶ Ejecutar
Nivel 4 · Desafío

Ejercicio 10: Diagnóstico de salud de datos

Escribí un mini reporte que imprima: (1) Total de filas, (2) Nulos por columna, (3) Duplicados, (4) Tipos de dato. Debe incluir la palabra object (tipo de las columnas de texto).

ejercicio_10_desafio.pyDebe incluir "object"

          
Hacé clic en ▶ Ejecutar
05

Resumen y conexión

En la siguiente lección (06 · pandas: transformaciones) vas a aprender a crear nuevas columnas, aplicar funciones, mapear valores y realizar los cálculos que convierten datos crudos en métricas de negocio.

Recursos: pandas docs — Working with missing data