Joins & Merges
Combinar tabelas por chaves compartilhadas é onde ocorrem duplicação silenciosa de linhas e perda de registros. merge e concat do pandas exigem tipos de join explícitos e validação.
Busque em todas as páginas da documentação
Combinar tabelas por chaves compartilhadas é onde ocorrem duplicação silenciosa de linhas e perda de registros. merge e concat do pandas exigem tipos de join explícitos e validação.
Cartão de receita de referência rápida - pronto para copiar e colar.
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"]Quando usar isso:
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]})
# Enriquecimento de dimensão - espera-se 1:1 ou muitos:1
enriched = orders.merge(
customers,
on="customer_id",
how="left",
validate="many_to_one",
)
# Extensão de fato - reembolsos podem estar ausentes
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"]
# Auditoria da cobertura do join
audit = orders.merge(customers, on="customer_id", how="left", indicator=True)
missing_customers = audit.loc[audit["_merge"] == "left_only"]
print(with_refunds)
print("linhas de cliente ausentes:", len(missing_customers))O que isso demonstra:
validate para afirmar expectativas de cardinalidadeindicator=True para detecção de órfãosmerge executa joins estilo banco de dados em chaves de coluna (hash ou sort-merge).how controla quais chaves sobrevivem: inner, left, right, outer.validate levanta um erro se a cardinalidade real violar a relação declarada.concat empilha ao longo do eixo 0 (linhas) ou 1 (colunas) sem alinhamento de chave.| how | Mantém |
|---|---|
| inner | Chaves em ambos |
| left | Todas as chaves da esquerda |
| right | Todas as chaves da direita |
| outer | União das chaves |
import pandas as pd
# Nomes de coluna diferentes
pd.merge(orders, regions, left_on="region_id", right_on="id")
# Unir arquivos mensais com colunas consistentes
pd.concat([jan, feb], ignore_index=True)validate="m:m" conscientemente com verificações de contagem de linhas.int64 vs object "1" resulta em join vazio. Correção: use astype nas chaves de ambos os lados antes do merge._x/_y. Correção: suffixes=("", "_dim") e remova colunas redundantes.on= junta no índice se alinhado. Correção: reset_index() ou flags explícitas left_index.ignore_index=True ou índice hierárquico por fonte.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
DuckDB read_parquet + SQL | Joins complexos de múltiplas tabelas | Dois frames pequenos em memória |
Polars join | Joins preguiçosos grandes | Já no meio do pipeline pandas |
DataFrame.join | Tabelas largas alinhadas por índice | Colunas chave não estão no índice |
| ETL de Banco de Dados | Os dados já vivem no data warehouse | Exploração apenas em notebook |
assert len(merged) == len(left) # para muitos para umlen antes/depois; investigue se o produto cresce.concat: mesmo esquema, empilhar períodos ou fragmentos.merge: tabelas diferentes compartilhando chaves.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= é mais claro para a maioria das análises.pd.merge_asof(trades.sort_values("ts"), quotes.sort_values("ts"), on="ts")right = right.drop_duplicates("customer_id", keep="last")Versões da Stack: Esta página foi escrita para Python 3.14.0 (stable 3.14, maintenance 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+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026