Объединение данных Pandas (merge / join)
Pandas предоставляет мощные возможности объединения данных, позволяющие соединять два или более DataFrame по ключам, подобно SQL.mergeиjoinявляются двумя наиболее часто используемыми методами.
Базовое использование merge
pd.merge()Функция используется для объединения двух DataFrame по столбцам, аналогично операции JOIN в SQL.
Простое объединение
Пример
# Создать два DataFrame
df1 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003"],
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"]
})
df2 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003"],
"Математика": [85, 92, 78]
})
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# Объединение
result = pd.merge(df1, df2, on="Student ID")
print("Результат объединения:")
print(result)
Объединение с разными именами столбцов
Пример
df1 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003"],
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"]
})
df2 = pd.DataFrame({
"student_id": ["S001", "S002", "S003"],
"Математика": [85, 92, 78]
})
# Используйте left_on и right_on
result = pd.merge(df1, df2, left_on="Student ID", right_on="student_id")
print("Слияние с разными именами столбцов:")
print(result)
print()
# Удалить избыточные столбцы
result = result.drop("student_id", axis=1)
print("После удаления избыточных столбцов:")
print(result)
Типы слияния
inner / left / right / outer
Пример
df1 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003", "S004"],
"Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"]
})
df2 = pd.DataFrame({
"Student ID": ["S001", "S002", "S003", "S005"],
"Математика": [85, 92, 78, 88]
})
print("DataFrame 1:")
print(df1)
print("\nDataFrame 2:")
print(df2)
print()
# внутреннее соединение (по умолчанию): оставить только то, что есть в обеих таблицах
print("внутреннее соединение (пересечение):")
print(pd.merge(df1, df2, on="Student ID", how="inner"))
print()
# левое соединение: сохранить все строки из левой таблицы
print("левое соединение (сохранить левую таблицу):")
print(pd.merge(df1, df2, on="Student ID", how="left"))
print()
# правое соединение: сохранить все строки из правой таблицы
print("правое соединение (сохранить правую таблицу):")
print(pd.merge(df1, df2, on="Student ID", how="right"))
print()
# внешнее соединение: сохранить все строки
print("внешнее соединение (объединение):")
print(pd.merge(df1, df2, on="Student ID", как="outer"))
Важно понимать различия между четырьмя типами JOIN: inner сохраняет пересечение, left сохраняет все строки из левой таблицы, right сохраняет все строки из правой таблицы, а outer сохраняет все строки из обеих таблиц.
Слияние по нескольким ключам
Пример
import pandas as pd
df1 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Sales": [100, 120, 90, 110]
})
df2 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Profit": [20, 25, 18, 22]
})
# Слияние по нескольким ключам
result = pd.merge(df1, df2, on=["City", "Year"])
print("Слияние по нескольким ключам:")
print(result)
Метод join
Пример
df1 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Sales": [100, 120, 90, 110]
})
df2 = pd.DataFrame({
"City": ["Beijing", "Beijing", "Shanghai", "Shanghai"],
"Year": [2023, 2024, 2023, 2024],
"Profit": [20, 25, 18, 22]
})
# Слияние по нескольким ключам
result = pd.merge(df1, df2, on=["City", "Year"])
print("Слияние по нескольким ключам:")
print(result)
DataFrame.join()Это ещё один метод слияния, который по умолчанию использует left join и объединяет по индексу.
Слияние по индексу
Пример
# Создать данные, задать индекс
df1 = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"],
"Возраст": [25, 30, 28]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"Математика": [85, 92, 78],
"Английский": [90, 88, 95]
}, index=["S001", "S002", "S003"])
print("DataFrame 1:")
print(df1)
print()
print("DataFrame 2:")
print(df2)
print()
# Использование join для объединения
result = df1.join(df2)
print("join merge:")
print(result)
Слияние нескольких таблиц
Пример
df1 = pd.DataFrame({
"Имя": ["Чжан Сань", "Ли Сы", "Ван У"]
}, index=["S001", "S002", "S003"])
df2 = pd.DataFrame({
"Математика": [85, 92, 78]
}, index=["S001", "S002", "S004"])
df3 = pd.DataFrame({
"Английский": [90, 88, 95]
}, index=["S001", "S003", "S004"])
# Цепочка join
result = df1.join(df2, how="left").join(df3, how="left")
print("Многотабличное соединение (left join):")
print(result)
print()
# Использование outer
result2 = df1.join(df2, how="outer").join(df3, how="outer")
print("Многотабличное соединение (полное внешнее соединение):")
print(result2)
Практика: связывание нескольких таблиц
Пример
# Смоделировать бизнес-данные
# 1. Таблица сотрудников
employees = pd.DataFrame({
"Employee ID": ["E001", "E002", "E003", "E004"],
"Имя": ["Чжан Сань", "Ли Сы", "Ван У", "Чжао Лю"],
"Department ID": ["D001", "D001", "D002", "D003"]
})
# 2. Таблица отделов
departments = pd.DataFrame({
"Department ID": ["D001", "D002", "D003"],
"Department Name": ["Технологический отдел", "Отдел продаж", "Операционный отдел"]
})
# 3. Таблица зарплат
salaries = pd.DataFrame({
"Employee ID": ["E001", "E002", "E003", "E004"],
"Зарплата": [12000, 15000, 11000, 18000]
})
print("Шаг 1: Объединение сотрудников и отделов")
result = pd.merge(employees, departments, on="Department ID")
print(result)
print()
print(Шаг 2: Затем объедините зарплаты)
result = pd.merge(result, salaries, on="Employee ID")
print(result)
Выбор между merge и join
| Сравнение | merge | join |
|---|---|---|
| Основы merge | Column | Index |
| join по умолчанию | внутренний | left |
| Применимые сценарии | Merge по бизнес-ключу | Merge по первичному ключу/индексу |
Другие расширенияВ большинстве случаев merge более гибок, тогда как join более краток при объединении по индексу. Выбирайте подходящий метод в зависимости от фактической структуры данных.