Combinación de datos de Pandas (merge / join)

Pandas ofrece potentes funciones de combinación de datos que permiten unir dos o más DataFrames mediante claves, de forma similar a SQL.mergeyjoinSon los dos métodos más utilizados.


Uso básico de merge

pd.merge()La función se utiliza para combinar dos DataFrames por columnas, similar a la operación JOIN de SQL.

Combinación simple

Ejemplo

import pandas as pd

# Crear dos DataFrames
df1 = pd.DataFrame({
    "ID de estudiante": ["S001", "S002", "S003"],
    "Nombre": ["Zhang San", "Li Si", "Wang Wu"]
})

df2 = pd.DataFrame({
    "ID de estudiante": ["S001", "S002", "S003"],
    "Matemáticas": [85, 92, 78]
})

print("DataFrame 1:")
print(df1)
print()

print("DataFrame 2:")
print(df2)
print()

# Combinar
result = pd.merge(df1, df2, on="ID de estudiante")
print("Resultado de la combinación:")
print(result)

Combinación con diferentes nombres de columna

Ejemplo

import pandas as pd

df1 = pd.DataFrame({
    "ID de estudiante": ["S001", "S002", "S003"],
    "Nombre": ["Zhang San", "Li Si", "Wang Wu"]
})

df2 = pd.DataFrame({
    "student_id": ["S001", "S002", "S003"],
    "Matemáticas": [85, 92, 78]
})

# Usar left_on y right_on
result = pd.merge(df1, df2, left_on="ID de estudiante", right_on="student_id")
print("Combinación con diferentes nombres de columna:")
print(result)
print()

# Eliminar columnas sobrantes
result = result.drop("student_id", axis=1)
print("Después de eliminar las columnas sobrantes:")
print(result)

Tipos de combinación

inner / left / right / outer

Ejemplo

import pandas as pd

df1 = pd.DataFrame({
    "ID de estudiante": ["S001", "S002", "S003", "S004"],
    "Nombre": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"]
})

df2 = pd.DataFrame({
    "ID de estudiante": ["S001", "S002", "S003", "S005"],
    "Matemáticas": [85, 92, 78, 88]
})

print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print()

# inner join (por defecto): solo conserva los que existen en ambos
print("inner join (intersección):")
print(pd.merge(df1, df2, on="ID de estudiante", how="inner"))
print()

# left join: conserva todas las filas de la tabla izquierda
print("left join (conserva la tabla izquierda):")
print(pd.merge(df1, df2, on="ID de estudiante", how="left"))
print()

# right join: conserva todas las filas de la tabla derecha
print("right join (conserva la tabla derecha):")
print(pd.merge(df1, df2, on="ID de estudiante", how="right"))
print()

# outer join: conserva todas las filas
print("outer join (unión):")
print(pd.merge(df1, df2, on="ID de estudiante", how="outer"))

Es muy importante entender la diferencia entre los cuatro tipos de JOIN: inner conserva la intersección, left conserva toda la tabla izquierda, right conserva toda la tabla derecha y outer conserva todas las filas de ambas tablas.


Combinación con múltiples claves

Ejemplo

import pandas as pd

df1 = pd.DataFrame({
    "Ciudad": ["Pekín", "Pekín", "Shanghái", "Shanghái"],
    "Año": [2023, 2024, 2023, 2024],
    "Ventas": [100, 120, 90, 110]
})

df2 = pd.DataFrame({
    "Ciudad": ["Pekín", "Pekín", "Shanghái", "Shanghái"],
    "Año": [2023, 2024, 2023, 2024],
    "Beneficio": [20, 25, 18, 22]
})

# Combinación con múltiples claves
result = pd.merge(df1, df2, on=["Ciudad", "Año"])
print("Combinación con múltiples claves:")
print(result)

Método join

DataFrame.join()Es otra forma de combinar; por defecto realiza una unión por la izquierda y combina según el índice.

Combinación por índice

Ejemplo

import pandas as pd

# Crear datos y establecer el índice
df1 = pd.DataFrame({
    "Nombre": ["Zhang San", "Li Si", "Wang Wu"],
    "Edad": [25, 30, 28]
}, index=["S001", "S002", "S003"])

df2 = pd.DataFrame({
    "Matemáticas": [85, 92, 78],
    "Inglés": [90, 88, 95]
}, index=["S001", "S002", "S003"])

print("DataFrame 1:")
print(df1)
print()

print("DataFrame 2:")
print(df2)
print()

# Combinar usando join
result = df1.join(df2)
print("Combinación con join:")
print(result)

Combinación de múltiples tablas

Ejemplo

import pandas as pd

df1 = pd.DataFrame({
    "Nombre": ["Zhang San", "Li Si", "Wang Wu"]
}, index=["S001", "S002", "S003"])

df2 = pd.DataFrame({
    "Matemáticas": [85, 92, 78]
}, index=["S001", "S002", "S004"])

df3 = pd.DataFrame({
    "Inglés": [90, 88, 95]
}, index=["S001", "S003", "S004"])

# join en cadena
result = df1.join(df2, how="left").join(df3, how="left")
print("join de múltiples tablas (left join):")
print(result)
print()

# Usar outer
result2 = df1.join(df2, how="outer").join(df3, how="outer")
print("join de múltiples tablas (full outer join):")
print(result2)

Práctica: relación de múltiples tablas

Ejemplo

import pandas as pd

# Simular datos de negocio
# 1. Tabla de empleados
employees = pd.DataFrame({
    "ID de empleado": ["E001", "E002", "E003", "E004"],
    "Nombre": ["Zhang San", "Li Si", "Wang Wu", "Zhao Liu"],
    "ID de departamento": ["D001", "D001", "D002", "D003"]
})

# 2. Tabla de departamentos
departments = pd.DataFrame({
    "ID de departamento": ["D001", "D002", "D003"],
    "Nombre del departamento": ["Departamento de Tecnología", "Departamento de Ventas", "Departamento de Operaciones"]
})

# 3. Tabla de salarios
salaries = pd.DataFrame({
    "ID de empleado": ["E001", "E002", "E003", "E004"],
    "Salario": [12000, 15000, 11000, 18000]
})

print("Paso 1: combinar empleados y departamentos")
result = pd.merge(employees, departments, on="ID de departamento")
print(result)
print()

print("Paso 2: combinar con los salarios")
result = pd.merge(result, salaries, on="ID de empleado")
print(result)

Elección entre merge y join

Comparación merge join
Criterio de combinación columna Índice
Unión por defecto inner left
Escenarios de aplicación Combinación por clave de negocio Combinación por clave principal/índice

En la mayoría de los casos, merge es más flexible y join es más conciso al combinar por índice. Elige el método adecuado según la estructura de datos real.

Otras extensiones