Функция Pandas pd.merge()

Pandas 通用函数Pandas: общие функции


pd.merge()— это функция в библиотеке Pandas, используемая дляобъединения двух DataFrame по столбцу. Она похожа на операцию JOIN в SQL и позволяет объединить две таблицы данных в одну на основе одного или нескольких общих столбцов.

Это один из наиболее часто используемых методов объединения при анализе и обработке данных. Он особенно подходит для работы с реляционными данными, позволяя объединять связанную информацию, разбросанную по разным таблицам.

Пояснение слова: mergeозначает «объединять, комбинировать»; здесь имеется в виду объединение двух таблиц данных на основе общего ключа.


Базовый синтаксис и параметры

pd.merge()— это функция верхнего уровня в библиотеке Pandas, используемая для выполнения операций, аналогичных JOIN в SQL.

Формат синтаксиса

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)

Описание параметра

  • Параметр: left
    • Тип: DataFrame.
    • Описание: левый DataFrame, первая таблица, участвующая в объединении.
  • Параметр: right
    • Тип: DataFrame.
    • Описание: правый DataFrame, вторая таблица, участвующая в объединении.
  • Параметр: on
    • Тип: строка или список строк.
    • Описание: имя столбца (ключа), используемого для соединения. И левый, и правый DataFrame должны иметь столбцы с одинаковым именем. Если не указано, будут автоматически найдены столбцы с таким же именем в качестве ключа.
  • Параметр: how
    • Тип: строка ('left', 'right', 'outer', 'inner').
    • Описание: Метод merge, аналогичный типам JOIN в SQL.'inner'обозначает внутреннее соединение (пересечение),'outer'обозначает внешнее соединение (объединение),'left'обозначает левое соединение (сохраняет все записи из левой таблицы),'right'обозначает правое соединение (сохраняет все записи из правой таблицы). По умолчанию используется'inner'。
  • Параметр: left_on
    • Тип: строка или список строк.
    • Описание: Имя столбца в левом DataFrame, используемое в качестве ключа соединения. Используется, когда имена столбцов ключа соединения в левой и правой таблицах различаются.
  • Параметр: right_on
    • Тип: строка или список строк.
    • Описание: Имя столбца в правом DataFrame, используемое в качестве ключа соединения. Используется, когда имена столбцов ключа соединения в левой и правой таблицах различаются.
  • Параметр: suffixes
    • Тип: кортеж.
    • Описание: Если левая и правая таблицы имеют столбцы с одинаковыми именами (не ключи соединения), суффиксы, используемые для их различения. По умолчанию используется('_x', '_y')。

Описание функций

  • Возвращаемое значение: Возвращает объединённый DataFrame.
  • Действие: Горизонтально объединяет два DataFrame в один DataFrame в соответствии с указанным ключом и методом.

Примеры

Давайте подробно освоим на серии примеров от простого к сложномуpd.merge()использование.

Пример 1: Базовое использование — внутреннее соединение по одному столбцу

Пример

import pandas as pd

# 1. Создать два DataFrame
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("=== Таблица сотрудников (employees) ===")
print(employees)

print("\n=== Таблица отделов (departments) ===")
print(departments)

# 2. Используйте pd.merge() для объединения по столбцу dept_id (внутреннее соединение, по умолчанию)
result = pd.merge(employees, departments, on='dept_id')
print("\n=== pd.merge(employees, departments, on='dept_id') внутреннее соединение ===")
print(result)

Ожидаемый результат выполнения:

=== 员工表 (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

Анализ кода:

  1. Две таблицы связаны черезdept_idстолбец, который является их общим столбцом.
  2. По умолчанию используется внутреннее соединение (how='inner'), сохраняются только ключевые значения, присутствующие с обеих сторон (dept_id 1 и 2), поэтому отдел Marketing с dept_id 3 исключается.
  3. После объединения каждому сотруднику сопоставляется соответствующее название отдела.

Пример 2: Левое соединение и правое соединение

Используяhowпараметр может управлять методом объединения, сохраняя все записи с одной стороны.

Пример

import pandas as pd

# Продолжаем использовать данные выше
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. Левое соединение - сохранить все записи из левой таблицы
print("=== Левое соединение (how='left') ===")
left_result = pd.merge(employees, departments, on='dept_id', how='left')
print(left_result)

# 2. Правое соединение - сохранить все записи из правой таблицы
print("\n=== Правое соединение (how='right') ===")
right_result = pd.merge(employees, departments, on='dept_id', how='right')
print(right_result)

# 3. Внешнее соединение — сохранить все записи из обеих таблиц
print("\n=== Внешнее соединение (how='outer') ===")
outer_result = pd.merge(employees, departments, on='dept_id', how='outer')
print(outer_result)

Ожидаемый результат выполнения:

=== 左连接 (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

Анализ кода:

  • Левое соединение сохраняет все записи сотрудников из левой таблицы (employees), а отделы без совпадения в правой таблице отображаются какNaN。
  • Правое соединение сохраняет все отделы из правой таблицы (departments), даже если ни один сотрудник не принадлежит этому отделу.
  • Внешнее соединение сохраняет все записи из обеих таблиц, а несовпадающие поля заполняютсяNaN.

Пример 3: Обработка двух таблиц с разными именами столбцов

Когда имена столбцов ключа соединения в двух таблицах различаются, можно использоватьleft_onиright_onпараметры, чтобы указать их отдельно.

Пример

import pandas as pd

# 1. Создайте два DataFrame с разными именами столбцов
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("=== Таблица студентов ===")
print(students)

print("\n=== Таблица классов ===")
print(classes)

# 2. Используйте left_on и right_on для обработки разных имён столбцов
result = pd.merge(students, classes, left_on='class_id', right_on='class_id')
print("\n=== Слияние с разными именами столбцов ===")
print(result)

Ожидаемый результат выполнения:

=== 学生表 ===
   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

Анализ кода:

  • Используйтеleft_index=Trueиright_index=TrueВы можете использовать индекс DataFrame в качестве ключа соединения.
  • Передайте список вonпараметр, чтобы выполнить слияние по нескольким ключам; все ключи должны совпадать, чтобы запись была сохранена.
  • Setindicator=Trueчтобы добавить специальный столбец, показывающий, из какой таблицы приходит каждая запись (left_only, right_only, both).

Совет: pd.merge()подходит для операций слияния по столбцам. Если вам нужно просто добавить данные вертикально (добавление строк), используйтеpd.concat()функцию.

Pandas 常用函数Pandas: общие функции

Другие расширения