Cómo unir dos DataFrames con pandas en Python
Combinar datos de dos tablas diferentes es una de las tareas más habituales en el análisis de datos. Con merge de pandas puedes unir dos DataFrames por la columna que tienen en común — por ejemplo, enlazar una tabla de pedidos con la tabla de clientes. Aquí lo harás paso a paso, con ejemplos sencillos y los errores más frecuentes que debes evitar.
Requisitos previos
- Python 3 instalado en tu ordenador.
- La biblioteca pandas instalada (
pip install pandas). - Conocer lo básico de un DataFrame: filas, columnas y la función
read_csv.
Paso 1: Crear los dos DataFrames
Para este ejemplo vamos a usar dos tablas pequeñas: una con clientes y otra con pedidos. Fíjate en que ambas tienen la columna cliente_id — esa es la columna que enlaza las dos tablas.
import pandas as pd
clientes = pd.DataFrame({
"cliente_id": [1, 2, 3],
"nome": ["Ana", "Bruno", "Carla"],
"cidade": ["Lisboa", "Porto", "Braga"]
})
pedidos = pd.DataFrame({
"pedido_id": [100, 101, 102, 103],
"cliente_id": [1, 2, 1, 3],
"valor": [50, 30, 20, 90]
})
Paso 2: Unir las tablas con merge
La función pd.merge recibe los dos DataFrames y el nombre de la columna común en el parámetro on. El resultado es una tabla nueva donde cada pedido queda junto a los datos de su cliente.
resultado = pd.merge(pedidos, clientes, on="cliente_id")
print(resultado)
Para cada fila de pedidos, pandas busca la fila correspondiente en clientes con el mismo cliente_id y une las columnas de las dos tablas.
Consejo: usa siempre on cuando la columna de enlace tiene el mismo nombre en las dos tablas. Es la forma más clara y evita confusiones.
Paso 3: Elegir el tipo de unión con how
Por defecto, merge hace un inner join: solo conserva las filas que existen en las dos tablas. El parámetro how permite cambiar ese comportamiento:
how="inner"— solo clientes con pedidos (el valor por defecto).how="left"— todos los pedidos, aunque no tengan cliente correspondiente.how="right"— todos los clientes, aunque no tengan pedidos.how="outer"— todo de las dos tablas.
todos = pd.merge(clientes, pedidos, on="cliente_id", how="left")
print(todos)
Con how="left" a partir de clientes, un cliente sin pedidos aparece igualmente, con valores ausentes (NaN) en las columnas de pedidos.
Paso 4: Unir por columnas con nombres diferentes
A veces la misma información tiene nombres diferentes en cada tabla — por ejemplo cliente_id en una e id en la otra. En ese caso usa left_on y right_on en lugar de on.
resultado = pd.merge(
pedidos, clientes,
left_on="cliente_id",
right_on="id"
)
Un error habitual es recibir un KeyError: ocurre cuando el nombre indicado en on no existe exactamente en una de las tablas. Comprueba siempre los nombres con df.columns.
Paso 5: Evitar columnas repetidas con suffixes
Cuando las dos tablas tienen columnas con el mismo nombre (además de la columna de enlace), pandas añade los sufijos _x y _y para distinguirlas. Puedes controlar esos sufijos con el parámetro suffixes para que el resultado sea más legible.
resultado = pd.merge(
pedidos, clientes,
on="cliente_id",
suffixes=("_pedido", "_cliente")
)
Comprobar el resultado
Para confirmar que la unión salió bien, mira el número de filas y echa un vistazo a las primeras con head():
print(resultado.shape)
print(resultado.head())
Si el número de filas es mucho mayor de lo que esperabas, es probable que la columna de enlace tenga valores repetidos en las dos tablas — vale la pena investigarlo con value_counts().
Conclusión
Ya sabes unir dos DataFrames con merge, elegir el tipo de unión con how y tratar columnas con nombres diferentes. El siguiente paso natural es explorar groupby para resumir los datos unidos — por ejemplo, el total gastado por ciudad. ¿Cuál será la primera unión que probarás con tus propios datos?