Función Pandas pd.merge()

Pandas 通用函数Funciones comunes de Pandas


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

import pandas as pd

# 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:

  1. Las dos tablas se conectan mediante ladept_idcolumna, que es su columna común.
  2. 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.
  3. 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

import pandas as pd

# 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 comoNaN。
  • 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 conNaNNaN.

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

import pandas as pd

# 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 alonpará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).

Consejo: 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.

Pandas 常用函数Funciones comunes de Pandas

Otras extensiones