Práctica — Validación de datos con pandera

Por Jose R. Zapata

Ultima actualización: 21/Ago/2026

Invítame a un Café

Objetivo

Esta práctica es de trabajo autónomo: no es un entregable calificable, es una guía paso a paso para que usted mismo entienda, ejecutando código, cómo funciona la validación de datos con pandera — definir un esquema, validar un DataFrame correcto, y luego provocar y leer un fallo de validación controlado.

Criterio de éxito: al terminar, debe poder explicar qué es un DataFrameSchema, qué hace Check, y cómo leer un reporte de errores (failure_cases) cuando algo no cumple el esquema.

Prerequisitos

Paso 1 — Instalar pandera

En su ambiente virtual del proyecto:

uv add 'pandera[pandas]'

Paso 2 — Crear un DataFrame de ejemplo (caso correcto)

Cree un notebook (practica_pandera.ipynb) con un DataFrame de pedidos de una tienda online — un dominio distinto al de la teoría, para que practique reconociendo el patrón en un contexto nuevo:

import pandas as pd

data = {
    "id_pedido": [101, 102, 103, 104, 105],
    "cantidad": [2, 1, 5, 3, 1],
    "precio_unitario": [19.99, 45.50, 8.75, 120.00, 300.00],
    "metodo_pago": ["tarjeta", "efectivo", "tarjeta", "transferencia", "tarjeta"],
    "codigo_cupon": ["DESC10A", "SINCUPON", "DESC5B", "SINCUPON", "PROMO20X"],
}
df = pd.DataFrame(data)
print(df)

Paso 3 — Definir el schema de validación

Defina un DataFrameSchema con al menos una regla por columna, usando Check (gt, in_range, str_matches, isin):

Ejemplo de respuesta

from pandera.pandas import Column, Check, DataFrameSchema

schema = DataFrameSchema({
    "id_pedido": Column(int, Check.gt(0), unique=True, required=True),
    "cantidad": Column(int, Check.in_range(1, 100), nullable=False),
    "precio_unitario": Column(float, Check.gt(0.0), nullable=False),
    "metodo_pago": Column(str, Check.isin(["tarjeta", "efectivo", "transferencia"])),
    "codigo_cupon": Column(str, Check.str_matches(r"^(SINCUPON|[A-Z]{4,6}\d{1,2}[A-Z]?)$")),
})

Paso 4 — Validar el caso correcto

Corra la validación con lazy=True (recolecta todos los errores en vez de detenerse en el primero) y confirme que pasa sin errores:

from pandera.errors import SchemaError

try:
    validated_df = schema.validate(df, lazy=True)
    print("DataFrame validado exitosamente:")
    print(validated_df)
except SchemaError as err:
    print("Errores de validación encontrados:")
    print(err.failure_cases)

Debe imprimir "DataFrame validado exitosamente" — si le aparece un error aquí, revise que copió bien los datos del Paso 2.

Paso 5 — Provocar un fallo controlado

Ahora modifique a propósito 2-3 valores del DataFrame para que rompan el esquema, por ejemplo:

data_invalidos = {
    "id_pedido": [101, 102, 102, 104],           # id duplicado (rompe unique=True)
    "cantidad": [2, -1, 500, 3],                  # -1 y 500 rompen in_range(1, 100)
    "precio_unitario": [19.99, -45.50, 8.75, 120.00],  # -45.50 rompe gt(0.0)
    "metodo_pago": ["tarjeta", "criptomoneda", "tarjeta", "transferencia"],  # "criptomoneda" no está en isin([...])
    "codigo_cupon": ["DESC10A", "sincupon", "10%OFF", "SINCUPON"],  # minúsculas y formato inválido rompen str_matches
}
df_invalido = pd.DataFrame(data_invalidos)

try:
    schema.validate(df_invalido, lazy=True)
except SchemaError as err:
    print("Errores de validación encontrados:")
    print(err.failure_cases)

Paso 6 — Interpretar el reporte de errores

Lea la salida de err.failure_cases (es un DataFrame) y responda para usted mismo, por cada fila del reporte:

  • ¿Qué columna (column) falló?
  • ¿Qué check se violó (check)?
  • ¿Cuál era el valor inválido (failure_case)?
  • ¿En qué fila del DataFrame original ocurrió (index)?
No hay que entregar nada de esta práctica. El objetivo es que usted mismo compruebe que entiende la relación entre la definición del schema (Paso 3) y el reporte de errores que genera (Paso 6) cuando los datos no cumplen las reglas.

Paso 7 (opcional) — Aplicar a su propio dataset

Si quiere reforzar el concepto, repita los Pasos 2-6 usando 2-3 columnas reales de su propio dataset de las prácticas anteriores en vez del ejemplo de id_pedido/metodo_pago/codigo_cupon.

Checklist de pasos

  • pandera instalado en el ambiente del proyecto
  • DataFrame de ejemplo correcto creado
  • Schema definido con al menos 1 Check por columna
  • Validación del caso correcto pasa sin errores
  • DataFrame con errores a propósito creado
  • Validación del caso inválido genera SchemaError / failure_cases
  • Puede explicar qué columna, check y valor causaron cada fallo

Referencias

Phd. Jose R. Zapata

Anterior