Limpieza y Transformación de Datos
Los conjuntos de datos reales llegan con dtypes incorrectos, valores faltantes y cadenas desordenadas. La limpieza hace que los agregados sean confiables antes de fusionar o modelar.
Busca en todas las páginas de la documentación
Los conjuntos de datos reales llegan con dtypes incorrectos, valores faltantes y cadenas desordenadas. La limpieza hace que los agregados sean confiables antes de fusionar o modelar.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
import pandas as pd
df = pd.read_csv("raw.csv", dtype={"region": "category"})
df["revenue"] = pd.to_numeric(df["revenue"], errors="coerce")
df["sku"] = df["sku"].str.strip().str.upper()
df = df.dropna(subset=["revenue"])Cuándo usar esto:
import pandas as pd
import numpy as np
from io import StringIO
raw = """order_id,region,revenue,sku,ordered_at
1, east , $120 , abc-1 , 01/15/2025
2,WEST,340,def-2,2025-01-16
3,EAST,N/A,abc-1,2025-01-17
"""
df = pd.read_csv(StringIO(raw), dtype={"region": "string[pyarrow]"})
# Eliminar espacios y normalizar claves de texto
df["region"] = df["region"].str.strip().str.title()
df["sku"] = df["sku"].str.upper()
# Analizar dinero y fechas
df["revenue"] = (
df["revenue"]
.str.replace("$", "", regex=False)
.str.replace(",", "", regex=False)
.replace("N/A", np.nan)
)
df["revenue"] = pd.to_numeric(df["revenue"], errors="coerce")
df["ordered_at"] = pd.to_datetime(df["ordered_at"], format="mixed", utc=True)
# Imputar con política documentada: mediana por región
df["revenue"] = df.groupby("region", observed=True)["revenue"].transform(
lambda s: s.fillna(s.median())
)
# Eliminar filas que aún faltan claves críticas
clean = df.dropna(subset=["order_id", "ordered_at"]).astype({"order_id": "int64"})
print(clean.dtypes)
print(clean)Lo que esto demuestra:
str para espacios en blanco y mayúsculas/minúsculasto_numeric(errors="coerce") convirtiendo tokens incorrectos en NANaN para flotantes, pd.NA para dtypes anulables, o None en columnas de objeto.astype puede copiar; convert_dtypes() actualiza a tipos de extensión de pandas anulables.| Tarea | API |
|---|---|
| Analizar números | pd.to_numeric(..., errors="coerce") |
| Analizar fechas | pd.to_datetime(..., utc=True) |
| Recortar valores atípicos | s.clip(lower, upper) |
| Renombrar columnas | df.rename(columns={"old": "new"}) |
| Deduplicar filas | df.drop_duplicates(subset=[...]) |
import pandas as pd
# Preferir Int64 anulable cuando NA es posible
df["units"] = pd.array([1, None, 3], dtype="Int64")
# map para reemplazos de dominio pequeño
df["status"] = df["status"].map({"A": "active", "I": "inactive"})df.dropna(inplace=True) en una porción corrompe el padre. Solución: asignar de vuelta: df = df.dropna().$ y . necesitan regex=False o escape. Solución: pasar regex=False para reemplazos literales.01/02/2025 se analiza de manera diferente según la configuración regional. Solución: forzar ISO "%Y-%m-%d" en el origen o usar format="mixed" con auditoría."East" y "east " se convierten en categorías diferentes antes de eliminar espacios. Solución: normalizar cadenas antes de astype("category").| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Pandera | Validación de esquemas en CI | Limpieza rápida en notebooks |
| Great Expectations | Contratos de datos de producción | Limpieza de CSV única |
Polars with_columns | Pipelines perezosos grandes | El equipo solo conoce pandas |
| OpenRefine / SQL | Limpieza con intervención humana a escala | ETL repetible y con script |
dupes = df[df.duplicated("order_id", keep=False)]NaN en lugar de generar un error.dropna o una tabla de cuarentena para filas incorrectas.df.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")groupby/gráficos.df[["city", "state"]] = df["location"].str.split(",", expand=True)for chunk in pd.read_csv("huge.csv", chunksize=100_000):
process(chunk)Q3 + 1.5*IQR - marcar, no eliminar silenciosamente sin revisión.pd.NA es el valor faltante escalar de pandas para dtypes de extensión anulables.np.nan es el valor faltante de float, se propaga en columnas de float.df["revenue"].isna().sum() == 0 después de la política.Versiones de la pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026