Merge, Join y Concatenar DataFrames
Combinando Datos de Multiples FuentesEn el mundo real, los datos casi nunca estan en una sola tabla. Tenes una tabla de clientes, otra de pedidos, otra de productos. Necesitas combinarlas para hacer analisis. Pandas tiene operaciones equivalentes a los JOINs de SQL.
pd.merge(): El JOIN de Pandas
import pandas as pd
# Tabla de empleados
empleados = pd.DataFrame({
'emp_id': [1, 2, 3, 4, 5],
'nombre': ['Ana', 'Carlos', 'Maria', 'Luis', 'Sofia'],
'dept_id': [101, 102, 101, 103, 102]
})
# Tabla de departamentos
departamentos = pd.DataFrame({
'dept_id': [101, 102, 103, 104],
'departamento': ['Marketing', 'Ventas', 'IT', 'RRHH'],
'presupuesto': [500000, 800000, 1200000, 300000]
})
# INNER JOIN (solo coincidencias en ambas tablas)
df_inner = pd.merge(empleados, departamentos, on='dept_id', how='inner')
print("INNER JOIN:")
print(df_inner)
# LEFT JOIN (todos de la izquierda + coincidencias de la derecha)
df_left = pd.merge(empleados, departamentos, on='dept_id', how='left')
print("\nLEFT JOIN:")
print(df_left)
# RIGHT JOIN (todos de la derecha + coincidencias de la izquierda)
df_right = pd.merge(empleados, departamentos, on='dept_id', how='right')
print("\nRIGHT JOIN:")
print(df_right)
# OUTER JOIN (todos de ambas tablas)
df_outer = pd.merge(empleados, departamentos, on='dept_id', how='outer')
print("\nOUTER JOIN:")
print(df_outer)
Merge con diferentes nombres de columnas
# Cuando las columnas tienen nombres diferentes
ventas = pd.DataFrame({
'id_venta': [1, 2, 3, 4],
'id_cliente': [101, 102, 101, 103],
'monto': [500, 1200, 300, 800]
})
clientes = pd.DataFrame({
'cliente_id': [101, 102, 103],
'nombre': ['Empresa A', 'Empresa B', 'Empresa C'],
'ciudad': ['Buenos Aires', 'Cordoba', 'Rosario']
})
# Usar left_on y right_on
df = pd.merge(
ventas, clientes,
left_on='id_cliente',
right_on='cliente_id',
how='left'
)
print(df)
pd.concat(): Apilar DataFrames
Concat es para unir DataFrames verticalmente (agregar mas filas) u horizontalmente (agregar mas columnas).
# Datos de ventas de diferentes meses
enero = pd.DataFrame({
'fecha': pd.date_range('2025-01-01', periods=5),
'ventas': [100, 150, 120, 180, 200]
})
febrero = pd.DataFrame({
'fecha': pd.date_range('2025-02-01', periods=5),
'ventas': [110, 160, 130, 170, 210]
})
marzo = pd.DataFrame({
'fecha': pd.date_range('2025-03-01', periods=5),
'ventas': [140, 180, 150, 200, 230]
})
# Concatenar verticalmente (apilar filas)
df_trimestre = pd.concat([enero, febrero, marzo], ignore_index=True)
print(f"Ventas del trimestre: {len(df_trimestre)} registros")
print(df_trimestre)
# Concatenar horizontalmente (agregar columnas)
df_horizontal = pd.concat([enero, febrero['ventas']], axis=1)
df_horizontal.columns = ['fecha', 'ventas_ene', 'ventas_feb']
print(df_horizontal)
Ejemplo Practico: Analisis Multi-tabla
import numpy as np
np.random.seed(42)
# Tabla de productos
productos = pd.DataFrame({
'producto_id': range(1, 6),
'nombre': ['Laptop', 'Monitor', 'Teclado', 'Mouse', 'Auriculares'],
'categoria': ['Computadoras', 'Perifericos', 'Perifericos', 'Perifericos', 'Audio'],
'precio': [1200, 350, 80, 45, 120]
})
# Tabla de ventas
ventas = pd.DataFrame({
'venta_id': range(1, 101),
'producto_id': np.random.choice(range(1, 6), 100),
'cantidad': np.random.randint(1, 10, 100),
'fecha': pd.date_range('2025-01-01', periods=100, freq='D'),
'region': np.random.choice(['AMBA', 'Interior'], 100)
})
# Combinar ventas con productos
df = pd.merge(ventas, productos, on='producto_id', how='left')
df['total'] = df['cantidad'] * df['precio']
# Analisis: Ventas totales por categoria y region
resumen = df.pivot_table(
values='total',
index='categoria',
columns='region',
aggfunc='sum',
margins=True
)
print("Ventas por categoria y region:")
print(resumen)
# Producto mas vendido
top_productos = df.groupby('nombre')['total'].sum().sort_values(ascending=False)
print("\nTop productos por ingresos:")
print(top_productos)
Video Recomendado
Pandas Merge y Join - Tutorial Completo
Ejercicio Practico
Crea un notebook 09_merge_join.ipynb:
- Crea 3 tablas: clientes, pedidos, productos
- Hace un merge para obtener los pedidos con nombre de cliente y nombre de producto
- Calcula el ingreso total por cliente
- Concatena datos de ventas de 3 meses diferentes
- Encuentra clientes que nunca hicieron un pedido (usando outer join)
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- merge(): Combinar tablas por columna comun (como SQL JOIN)
- concat(): Apilar DataFrames vertical u horizontalmente
- Tipos de join: inner, left, right, outer
- left_on/right_on: Cuando las columnas tienen nombres diferentes
- ignore_index=True: Resetear indices al concatenar
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.