Función Pandas pd.merge()
pd.merge()Es la función de la biblioteca de Pandas que se utiliza paraunir dos DataFrames por columnas. Es similar a la operación JOIN en SQL, y puede combinar dos tablas de datos en una basándose en una o más columnas comunes.
Esta es una de las formas de combinación más utilizadas en el análisis y procesamiento de datos. Es especialmente adecuada para manejar datos relacionales, integrando información relevante que está dispersa en diferentes tablas.
Significado de la palabra: mergeSignifica "combinar, fusionar"; aquí se refiere a combinar dos tablas de datos según una clave común.
Sintaxis básica y parámetros
pd.merge()Es una función de primer nivel de la biblioteca de Pandas, utilizada para implementar operaciones similares al JOIN en SQL.
Formato de sintaxis
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
Descripción de parámetros
- Parámetro:
left- Tipo: DataFrame.
- Descripción: El DataFrame de la izquierda, la primera tabla que participa en la combinación.
- Parámetro:
right- Tipo: DataFrame.
- Descripción: El DataFrame de la derecha, la segunda tabla que participa en la combinación.
- Parámetro:
on- Tipo: Cadena de texto (string) o lista de cadenas de texto.
- Descripción: El nombre de la columna (clave) utilizada para la conexión. Ambos DataFrames, el izquierdo y el derecho, deben tener columnas con el mismo nombre. Si no se especifica, se buscará automáticamente una columna con el mismo nombre como clave.
- Parámetro:
how- Tipo: Cadena de texto ('left', 'right', 'outer', 'inner').
- Descripción: El método de combinación, similar al tipo JOIN de SQL.
'inner'Representa la unión interna (intersección),'outer'representa la unión externa (unión),'left'representa la unión izquierda (conserva todos los registros de la tabla izquierda),'right'representa la unión derecha (conserva todos los registros de la tabla derecha). El valor predeterminado es'inner'。
- Parámetro:
left_on- Tipo: Cadena de texto o lista de cadenas de texto.
- Descripción: El nombre de la columna en el DataFrame izquierdo que se utiliza como clave de conexión. Se utiliza cuando los nombres de las columnas clave de las dos tablas son diferentes.
- Parámetro:
right_on- Tipo: Cadena de texto o lista de cadenas de texto.
- Descripción: El nombre de la columna en el DataFrame derecho que se utiliza como clave de conexión. Se utiliza cuando los nombres de las columnas clave de las dos tablas son diferentes.
- Parámetro:
suffixes- Tipo: Tupla.
- Descripción: Sufijo utilizado para distinguir cuando las dos tablas tienen columnas con el mismo nombre (que no son claves de conexión). El valor predeterminado es
('_x', '_y')。
Descripción de la función
- Valor de retorno: Devuelve el DataFrame combinado.
- Efecto: Combina horizontalmente dos DataFrames en un único DataFrame según la clave y el método especificados.
Ejemplos
A través de una serie de ejemplos, de simples a complejos, dominaremos por completopd.merge()su uso.
Ejemplo 1: Uso básico: unión interna basada en una sola columna
Ejemplo
# 1. Crear dos DataFrames
employees = pd.DataFrame({
'emp_id': [101, 102, 103, 104],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'dept_id': [1, 2, 1, 2]
})
departments = pd.DataFrame({
'dept_id': [1, 2, 3],
'dept_name': ['Engineering', 'Sales', 'Marketing']
})
print("=== Tabla de empleados (employees) ===")
print(employees)
print("\n"=== Tabla de departamentos (departments) ===")
print(departments)
# 2. Usar pd.merge() para combinar basándose en la columna dept_id (unión interna, por defecto)
result = pd.merge(employees, departments, on='dept_id')
print("\n"=== pd.merge(employees, departments, on='dept_id') unión interna ===")
print(result)
Resultado esperado de la ejecución:
=== 员工表 (employees) === emp_id name dept_id 0 101 Alice 1 1 102 Bob 2 2 103 Charlie 1 3 104 Diana 2 === 部门表 (departments) === dept_id dept_name 0 1 Engineering 1 2 Sales 2 3 Marketing === pd.merge(employees, departments, on='dept_id') 内连接 === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales
Análisis del código:
- Las dos tablas se conectan mediante la
dept_idcolumna, que es su columna común. - Por defecto se utiliza la unión interna (
how='inner'), conservando solo las claves presentes en ambos lados (dept_id 1 y 2), por lo que el departamento de marketing con dept_id 3 queda excluido. - Después de la combinación, cada empleado queda asociado con el nombre del departamento correspondiente.
Ejemplo 2: Unión izquierda y unión derecha
Usando elhowparámetro se puede controlar el método de combinación, conservando todos los registros de una de las partes.
Ejemplo
# Continuar usando los datos anteriores
employees = pd.DataFrame({
'emp_id': [101, 102, 103, 104],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'dept_id': [1, 2, 1, 2]
})
departments = pd.DataFrame({
'dept_id': [1, 2, 3],
'dept_name': ['Engineering', 'Sales', 'Marketing']
})
# 1. Unión izquierda - conservar todos los registros de la tabla izquierda
print("=== Unión izquierda (how='left') ===")
left_result = pd.merge(employees, departments, on='dept_id', how='left')
print(left_result)
# 2. Unión derecha - conservar todos los registros de la tabla derecha
print("\n"=== Unión derecha (how='right') ===")
right_result = pd.merge(employees, departments, on='dept_id', how='right')
print(right_result)
# 3. Unión externa - conservar todos los registros de ambas tablas
print("\n"=== Unión externa (how='outer') ===")
outer_result = pd.merge(employees, departments, on='dept_id', how='outer')
print(outer_result)
Resultado esperado de la ejecución:
=== 左连接 (how='left') === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales === 右连接 (how='right') === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales 4 NaN NaN 3 Marketing === 外连接 (how='outer') === emp_id name dept_id dept_name 0 101 Alice 1 Engineering 1 103 Charlie 1 Engineering 2 102 Bob 2 Sales 3 104 Diana 2 Sales 4 NaN NaN 3 Marketing
Análisis del código:
- La unión izquierda conserva todos los registros de empleados de la tabla izquierda (employees); los departamentos sin coincidencia en la tabla derecha se muestran como
NaN。 - La unión derecha conserva todos los departamentos de la tabla derecha (departments), incluso si ningún empleado pertenece a ese departamento.
- La unión externa conserva todos los registros de ambas tablas; los campos sin coincidencia se rellenan con
NaNNaN.
Ejemplo 3: Manejo de dos tablas con nombres de columnas diferentes
Cuando los nombres de las columnas clave de las dos tablas son diferentes, se pueden usar losleft_onyright_onparámetros para especificarlos por separado.
Ejemplo
# 1. Crear dos DataFrames con nombres de columnas diferentes
students = pd.DataFrame({
'student_id': [1, 2, 3, 4],
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'class_id': [101, 102, 101, 103]
})
classes = pd.DataFrame({
'class_id': [101, 102, 103],
'class_name': ['Class A', 'Class B', 'Class C'],
'teacher': ['Mr. Smith', 'Ms. Johnson', 'Mrs. Lee']
})
print("=== Tabla de estudiantes ===")
print(students)
print("\n"=== Tabla de clases ===")
print(classes)
# 2. Usar left_on y right_on para manejar nombres de columnas diferentes
result = pd.merge(students, classes, left_on='class_id', right_on='class_id')
print("\n"=== Combinación con nombres de columnas diferentes ===")
print(result)
Resultado esperado de la ejecución:
=== 学生表 ===
student_id name class_id
0 1 Alice 101
1 2 Bob 102
2 3 Charlie 101
3 4 Diana 103
=== 班级表 ===
class_id class_name teacher
0 101 Class A Mr. Smith
1 102 Class B Ms. Johnson
2 103 Class C Mrs. Lee
=== 不同列名时的合并 ===
student_id name class_id class_name teacher
0 1 Alice 101 Class A Mr. Smith
1 3 Charlie 101 Class A Mr. Smith
2 2 Bob 102 Class B Indicator False
3 indicator column
print("\n=== indicator=True 显示合并详情 ===")
print(result_indicator)
[/mycode4]</div>
</div>
<p><strong>运行结果预期:</strong></p>
<pre>
=== 索引作为连接键 ===
name city score subject grade
0 Alice Beijing 85 Math A
1 Bob Shanghai 90 Math B
2 Charlie Guangzhou 95 English A
3 Diana Shenzhen 88 English B
=== 多个键的合并 ===
student_id name course_id course_name score
0 1 Alice 101 Math 90
1 1 Alice 102 English 85
2 2 Bob 101 Math 88
3 2 Bob 103 Science 92
4 3 Charlie 102 English 95
=== indicator=True 显示合并详情 ===
name city merge_info
0 Alice Beijing both
1 Bob Shanghai both
2 Charlie Guangzhou left_only
3 Diana Shenzhen left_only
Análisis del código:
- Usando estos parámetros,
left_index=Trueyright_index=Truese puede utilizar el índice del DataFrame como clave de conexión. - Pasar una lista al
onparámetro permite realizar una combinación con múltiples claves; es necesario que todas las claves coincidan para conservar el registro. - Configurándolo,
indicator=Truese puede agregar una columna especial que muestra de qué tabla proviene cada registro (left_only, right_only, both).
Otras extensionesConsejo:
pd.merge()Es adecuado para operaciones de combinación basadas en columnas. Si solo necesita agregar datos verticalmente (añadir filas), utilice lapd.concat()función.
Funciones comunes de Pandas