Функция Pandas pd.merge()
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: Базовое использование — внутреннее соединение по одному столбцу
Пример
# 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
Анализ кода:
- Две таблицы связаны через
dept_idстолбец, который является их общим столбцом. - По умолчанию используется внутреннее соединение (
how='inner'), сохраняются только ключевые значения, присутствующие с обеих сторон (dept_id 1 и 2), поэтому отдел Marketing с dept_id 3 исключается. - После объединения каждому сотруднику сопоставляется соответствующее название отдела.
Пример 2: Левое соединение и правое соединение
Используяhowпараметр может управлять методом объединения, сохраняя все записи с одной стороны.
Пример
# Продолжаем использовать данные выше
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параметры, чтобы указать их отдельно.
Пример
# 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параметр, чтобы выполнить слияние по нескольким ключам; все ключи должны совпадать, чтобы запись была сохранена. - Set
indicator=Trueчтобы добавить специальный столбец, показывающий, из какой таблицы приходит каждая запись (left_only, right_only, both).
Другие расширенияСовет:
pd.merge()подходит для операций слияния по столбцам. Если вам нужно просто добавить данные вертикально (добавление строк), используйтеpd.concat()функцию.
Pandas: общие функции