Combinando DataFrames
Combina conjuntos de datos relacionados usando merge(), join() y concat() para construir tablas de análisis completas.
- Combinar dos DataFrames con una clave compartida usando merge()
- Comprender las uniones inner, left, right y outer
- Concatenar DataFrames verticalmente con concat()
- Manejar conflictos de combinación cuando las columnas tienen nombres superpuestos
¿Por qué combinar?
Los análisis reales suelen requerir datos de múltiples fuentes. Combinar une dos DataFrames basándose en una clave compartida, como una JOIN en SQL o un BUSCARV en Excel.
import pandas as pd
# Create sample DataFrames
passengers = pd.DataFrame({
"passenger_id": [1, 2, 3, 4, 5],
"name": ["Alice", "Bob", "Carol", "David", "Eve"],
"class": [1, 3, 2, 3, 1]
})
tickets = pd.DataFrame({
"passenger_id": [1, 2, 3, 6],
"fare": [100.0, 15.5, 26.0, 30.0],
"embarked": ["S", "C", "S", "Q"]
})Combinación básica
merged = pd.merge(passengers, tickets, on="passenger_id")
print(merged)Salida:
passenger_id name class fare embarked
0 1 Alice 1 100.0 S
1 2 Bob 3 15.5 C
2 3 Carol 2 26.0 S
Solo aparecen los pasajeros 1, 2 y 3, esto es una unión inner (la predeterminada). Los pasajeros 4 y 5 no tienen datos de boleto; el pasajero 6 no tiene datos de pasajero.
Tipos de unión
Unión inner (predeterminada), solo las filas coincidentes de ambos lados:
pd.merge(passengers, tickets, on="passenger_id")Unión left, conserva todas las filas del DataFrame izquierdo:
pd.merge(passengers, tickets, on="passenger_id", how="left")Salida:
passenger_id name class fare embarked
0 1 Alice 1 100.0 S
1 2 Bob 3 15.5 C
2 3 Carol 2 26.0 S
3 4 David 3 NaN NaN
4 5 Eve 1 NaN NaN
Unión right, conserva todas las filas del DataFrame derecho:
pd.merge(passengers, tickets, on="passenger_id", how="right")Unión outer, conserva todas las filas de ambos lados:
pd.merge(passengers, tickets, on="passenger_id", how="outer")Salida:
passenger_id name class fare embarked
0 1 Alice 1.0 100.0 S
1 2 Bob 3.0 15.5 C
2 3 Carol 2.0 26.0 S
3 4 David 3.0 NaN NaN
4 5 Eve 1.0 NaN NaN
5 6 NaN NaN 30.0 Q
Combinando con nombres de columnas diferentes
Cuando las columnas clave tienen nombres diferentes, usa left_on y right_on:
df1 = pd.DataFrame({"id_a": [1, 2, 3], "val": ["x", "y", "z"]})
df2 = pd.DataFrame({"id_b": [1, 2, 3], "score": [10, 20, 30]})
merged = pd.merge(df1, df2, left_on="id_a", right_on="id_b")
print(merged)Manejando nombres de columnas superpuestos
Cuando ambos DataFrames tienen columnas con el mismo nombre (además de la clave), pandas agrega sufijos:
merged = pd.merge(passengers, tickets, on="passenger_id", suffixes=("_pass", "_tick"))Combinando por índice
Si la clave es el índice, usa left_index y right_index:
passengers_idx = passengers.set_index("passenger_id")
tickets_idx = tickets.set_index("passenger_id")
merged = pd.merge(passengers_idx, tickets_idx, left_index=True, right_index=True)Concatenación
concat() apila DataFrames vertical u horizontalmente:
Vertical (apilar filas):
df_top = pd.DataFrame({"name": ["Alice", "Bob"], "score": [88, 92]})
df_bottom = pd.DataFrame({"name": ["Carol", "David"], "score": [79, 95]})
combined = pd.concat([df_top, df_bottom], ignore_index=True)
print(combined)Horizontal (agregar columnas):
df_a = pd.DataFrame({"name": ["Alice", "Bob"]})
df_b = pd.DataFrame({"score": [88, 92]})
combined = pd.concat([df_a, df_b], axis=1)Ejemplo práctico: datos del Titanic
# titanic.csv ships with the course — load it from the browser file system.
titanic = pd.read_csv("titanic.csv")
# Create a summary DataFrame
class_stats = titanic.groupby("Pclass").agg(
avg_fare=("Fare", "mean"),
avg_age=("Age", "median"),
survival_rate=("Survived", "mean")
).reset_index()
print(class_stats)El reset_index() convierte el índice agrupado de nuevo en una columna regular, lo cual es necesario antes de combinar.
Inténtalo
Crea dos DataFrames: students con las columnas id, name y grades con las columnas id, math, english. Combínalos con id usando una unión left. Luego concatena dos DataFrames pequeños verticalmente.
import pandas as pd
students = pd.DataFrame({"id": [1, 2, 3], "name": ["Alice", "Bob", "Carol"]})
grades = pd.DataFrame({"id": [1, 2, 4], "math": [88, 92, 75], "english": [90, 85, 80]})
merged = pd.merge(students, grades, on="id", how="left")
print(merged)
df1 = pd.DataFrame({"name": ["X", "Y"], "val": [1, 2]})
df2 = pd.DataFrame({"name": ["Z"], "val": [3]})
print(pd.concat([df1, df2], ignore_index=True))Conclusiones clave
merge()combina DataFrames con claves compartidas;concat()los apila vertical u horizontalmente- El parámetro
howcontrola el tipo de unión: inner (predeterminado), left, right, outer - Usa
left_on/right_oncuando las columnas clave tienen nombres diferentes - Ejecuta siempre
reset_index()después de groupby antes de combinar
Desafío de práctica
Del conjunto de datos del Titanic, crea un DataFrame de resumen agrupado por Pclass con las columnas: Pclass, avg_fare, survival_rate, passenger_count. Luego crea otro resumen agrupado por Embarked. Combina estos dos resúmenes con Pclass usando una unión left. ¿Qué información se pierde o se gana?
1. ¿Qué es una combinación (merge) en pandas?
2. ¿Qué tipo de combinación conserva solo las filas coincidentes?
3. ¿Qué sucede con una combinación left si el DataFrame derecho no tiene coincidencia?