Объединение данных Pandas (merge / join)

Pandas предоставляет мощные возможности объединения данных, позволяющие соединять два или более DataFrame по ключам, подобно SQL.mergeиjoinявляются двумя наиболее часто используемыми методами.


Базовое использование merge

pd.merge()Функция используется для объединения двух DataFrame по столбцам, аналогично операции JOIN в SQL.

Простое объединение

Пример

import pandas as pd

# Создать два 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)

Объединение с разными именами столбцов

Пример

import pandas as pd

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

Пример

import pandas as pd

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

DataFrame.join()Это ещё один метод слияния, который по умолчанию использует left join и объединяет по индексу.

Слияние по индексу

Пример

import pandas as pd

# Создать данные, задать индекс
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)

Слияние нескольких таблиц

Пример

import pandas as pd

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)

Практика: связывание нескольких таблиц

Пример

import pandas as pd

# Смоделировать бизнес-данные
# 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 более краток при объединении по индексу. Выбирайте подходящий метод в зависимости от фактической структуры данных.

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