Por Jose R. Zapata
Ultima actualización: 21/Ago/2026
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
- Ambiente configurado (Práctica — Configuración del entorno de desarrollo).
- Haber leído Validación de datos en python, en particular la sección de
pandera.
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é
checkse violó (check)? - ¿Cuál era el valor inválido (
failure_case)? - ¿En qué fila del DataFrame original ocurrió (
index)?
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
-
panderainstalado en el ambiente del proyecto - DataFrame de ejemplo correcto creado
- Schema definido con al menos 1
Checkpor 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