Joins y Combinaciones
Combinar tablas en claves compartidas es donde ocurren la duplicación silenciosa de filas y la pérdida de registros. merge y concat de pandas requieren tipos de unión explícitos y validación.
Busca en todas las páginas de la documentación
Combinar tablas en claves compartidas es donde ocurren la duplicación silenciosa de filas y la pérdida de registros. merge y concat de pandas requieren tipos de unión explícitos y validación.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
import pandas as pd
merged = left.merge(
right,
on="order_id",
how="left",
validate="many_to_one",
indicator=True,
)
unmatched = merged.loc[merged["_merge"] == "left_only"]Cuándo usar esto:
import pandas as pd
orders = pd.DataFrame(
{"order_id": [1, 2, 3], "customer_id": [10, 11, 10], "amount": [120, 340, 80]}
)
customers = pd.DataFrame(
{"customer_id": [10, 11], "segment": ["SMB", "Enterprise"]}
)
refunds = pd.DataFrame({"order_id": [2], "refund": [50.0]})
# Enriquecimiento de dimensión - se espera 1:1 o muchos:1
enriched = orders.merge(
customers,
on="customer_id",
how="left",
validate="many_to_one",
)
# Extensión de hechos - los reembolsos pueden faltar
with_refunds = enriched.merge(
refunds,
on="order_id",
how="left",
validate="one_to_one",
)
with_refunds["refund"] = with_refunds["refund"].fillna(0.0)
with_refunds["net"] = with_refunds["amount"] - with_refunds["refund"]
# Auditoría de cobertura de la combinación
audit = orders.merge(customers, on="customer_id", how="left", indicator=True)
missing_customers = audit.loc[audit["_merge"] == "left_only"]
print(with_refunds)
print("filas de clientes faltantes:", len(missing_customers))Lo que esto demuestra:
validate para afirmar las expectativas de cardinalidadindicator=True para la detección de huérfanosmerge realiza uniones estilo base de datos en claves de columna (hash o sort-merge).how controla qué claves sobreviven: inner, left, right, outer.validate lanza un error si la cardinalidad real viola la relación declarada.concat apila a lo largo del eje 0 (filas) o 1 (columnas) sin alineación de claves.| how | Mantiene |
|---|---|
| inner | Claves en ambos |
| left | Todas las claves izquierdas |
| right | Todas las claves derechas |
| outer | Unión de claves |
import pandas as pd
# Nombres de columna diferentes
pd.merge(orders, regions, left_on="region_id", right_on="id")
# Unir archivos mensuales con columnas consistentes
pd.concat([jan, feb], ignore_index=True)validate="m:m" a sabiendas con comprobaciones de recuento de filas.int64 vs object "1" produce una combinación vacía. Solución: usar astype en las claves de ambos lados antes de la combinación._x/_y por defecto. Solución: suffixes=("", "_dim") y eliminar columnas redundantes.on= olvidado combina en el índice si está alineado. Solución: reset_index() o indicadores explícitos left_index.concat sin ignore_index - preserva etiquetas de fila duplicadas. Solución: ignore_index=True o índice jerárquico por fuente.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
DuckDB read_parquet + SQL | Combinaciones complejas de múltiples tablas | Dos marcos pequeños en memoria |
Polars join | Combinaciones perezosas grandes | Ya inmerso en el pipeline de pandas |
DataFrame.join | Tablas anchas alineadas por índice | Columnas clave no en el índice |
| ETL de base de datos | Los datos ya viven en el almacén de datos | Exploración solo en notebooks |
assert len(merged) == len(left) # para muchos a unolen antes/después; investiga si el producto crece.concat: mismo esquema, apilar períodos o fragmentos.merge: tablas diferentes que comparten claves.left.merge(right, on=["region", "month"])_merge: left_only, right_only, both.left.merge(right, on="id", how="left", indicator=True).query("_merge == 'left_only'")on= es más claro para la mayoría de los análisis.pd.merge_asof(trades.sort_values("ts"), quotes.sort_values("ts"), on="ts")right = right.drop_duplicates("customer_id", keep="last")Versiones de Stack: 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