Слияние DataFrame в Pandas: руководство по merge и concat

Если вы используете Python, даже для простых задач, вы, наверное, знаете, насколько важны сторонние библиотеки. Pandas — одна из ключевых библиотек для работы с табличными данными (DataFrame). Она позволяет импортировать файлы разных форматов, создавать таблицы и объединять их для дальнейшего анализа.
В этом руководстве — понятные примеры, практические советы и чек-листы для безопасного и предсказуемого объединения DataFrame с помощью merge и concat.
Основные понятия
DataFrame — двухмерная табличная структура в Pandas. Ключ (primary key) — столбец или набор столбцов, по которым выполняется совпадение строк при объединении. Типы объединений: left, right, inner, outer (по аналогии с SQL). Если термин неясен: DataFrame — это как таблица в Excel или SQL.
Подготовка: создание тестовых DataFrame
Для практики удобно сначала создать простые словари и преобразовать их в DataFrame.
Создайте DataFrame в Python
Импортируйте Pandas и определите словари:
import pandas as pd
# исходные словари
dict1 = {
"user_id": ["001", "002", "003", "004", "005"],
"FName": ["John", "Brad", "Ron", "Roald", "Chris"],
"LName": ["Harley", "Cohen", "Dahl", "Harrington", "Kerr-Hislop"]
}
dict2 = {
"user_id": ["001", "002", "003", "004"],
"Age": [15, 28, 34, 24]
}
# преобразование в DataFrame
df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)
# быстрый просмотр
print(df1.head())
print(df2.head())Важно: у вас должен быть общий столбец (ключ), чтобы объединение по совпадению имело смысл — здесь это “user_id”.
Объединение DataFrame через pd.merge
Функция merge применяется для SQL-подобных джоинов. Базовый синтаксис:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None)Где:
- left и right — объединяемые DataFrame.
- how — тип объединения: ‘left’, ‘right’, ‘inner’, ‘outer’.
- on — имя столбца(ов) в обоих DataFrame для совпадения; или используйте left_on/right_on.
Примеры типов объединений
- Left: сохраняет все строки из левого DataFrame и дополняет совпадающими столбцами из правого.
left_merge = pd.merge(df1, df2, how='left', on='user_id')- Right: сохраняет все строки из правого DataFrame.
right_merge = pd.merge(df1, df2, how='right', on='user_id')- Inner: оставляет только совпадающие строки по ключу.
inner_merge = pd.merge(df1, df2, how='inner', on='user_id')- Outer: объединяет все строки из обоих DataFrame, заполняя NaN для отсутствующих значений.
outer_merge = pd.merge(df1, df2, how='outer', on='user_id')Советы:
- Всегда явно указывайте параметр on или left_on/right_on.
- При неоднозначных названиях столбцов используйте suffixes, например suffixes=(‘_left’, ‘_right’).
Важно: проверьте типы данных (dtype) столбцов-ключей — разные типы (строка vs int) приведут к пустым совпадениям.
Объединение с помощью pd.concat
concat удобен для склеивания DataFrame по оси. Синтаксис:
pd.concat(objs, axis=0, join='outer', ignore_index=False)Где:
- objs — список DataFrame.
- axis=0 (по строкам) или axis=1 (по столбцам).
- join=’outer’ или ‘inner’ — как объединять столбцы при axis=1.
- ignore_index=True сбросит индексы и задаст новый последовательный индекс.
Пример простой конкатенации (по умолчанию axis=0):
df_merged_concat = pd.concat([df1, df2], ignore_index=True)
print(df_merged_concat)Если нужно соединить столбцы и оставить только общие столбцы:
df_merged_concat = pd.concat([df1, df2], axis=1, join='inner')
print(df_merged_concat)Особенности concat:
- concat по строкам не выравнивает по ключам — он просто добавляет строки.
- Для выравнивания по ключам используйте merge или reindex после concat.
Когда merge или concat не работают: типичные ошибки и решения
- Неподходящие типы ключей
- Символы/числа/NaN. Решение: привести столбцы к одному dtype с astype, например df[‘user_id’] = df[‘user_id’].astype(str).
- Дубликаты в ключах
- Если ключ не уникален, merge породит больше строк (картезианское произведение для совпадающих ключей). Решение: агрегировать или убрать дубликаты заранее.
- Пропущенные значения
- NaN в ключах обычно не совпадают. Решение: заполнить или фильтровать строки с NaN.
- Разные названия столбцов
- Используйте left_on/right_on или переименуйте столбцы.
- Большие объёмы данных
- Для сотен миллионов строк используйте Dask, Vaex или базу данных.
Альтернативные подходы и расширения
- DataFrame.join — удобен, когда нужно объединять по индексу.
- Series.combine_first — заполнить пропуски значениями из другой Series/DataFrame.
- merge_asof — полезен для временных рядов (сопоставляет ближайшую предыдущую запись по времени).
- SQL (sqlite/sqlalchemy) — когда операции проще выполнить в СУБД.
- Dask/Modin — масштабирование на несколько ядер/кластер.
Ментальные модели (как выбирать тип объединения)
- Left = «добавляю данные к основному списку».
- Right = «добавляю данные к вспомогательному списку».
- Inner = «хочу только совпадающие записи» (пересечение множеств).
- Outer = «хочу все записи из обеих таблиц» (объединение множеств).
Мини‑методика: безопасный рабочий поток для объединений
- Проверить схемы (df.dtypes, df.columns).
- Проверить уникальность ключа (df[‘key’].is_unique).
- Привести типы ключей к общему типу.
- Выполнить тестовое объединение на небольшом срезе.
- Проверить количество строк и отсутствующие значения.
- Добавить суффиксы для конфликтующих столбцов.
- Зафиксировать преобразования и сохранить результат.
Шпаргалка: часто используемые сниппеты
- Приведение типа ключа:
df['user_id'] = df['user_id'].astype(str)- Проверка уникальности и подсчёт совпадений:
print(df1['user_id'].nunique(), df1.shape[0])
print(df2['user_id'].nunique(), df2.shape[0])- Использование суффиксов при совпадающих именах столбцов:
merged = pd.merge(df1, df2, on='user_id', how='left', suffixes=('_left', '_right'))- Удаление дубликатов ключей (при агрегировании):
df2_agg = df2.groupby('user_id', as_index=False).agg({'Age': 'mean'})Сравнение типов объединений
| Тип | Что сохраняет | Типичный сценарий |
|---|---|---|
| left | Все строки из левого Table | Основная таблица — пользователи |
| right | Все строки из правого Table | Обновляемая таблица —측эт |
| inner | Только совпадающие строки | Аналитика на пересечении наборов |
| outer | Все строки из обеих таблиц | Объединение списков с заполнением пустыми |
Роль‑ориентированные чек‑листы
Аналитик:
- Убедиться в корректности ключей и типов.
- Выполнить inner merge для проверки пересечений.
- Документировать шаги и сохранить таблицу.
Разработчик ETL:
- Добавить в пайплайн преобразование типов.
- Обработать дубликаты и NaN.
- Проверить SLI: количество строк до/после.
Data Engineer:
- Оценить масштаб и выбрать Dask/SQL при необходимости.
- Логировать затраты по времени и памяти.
Критерии приёмки
- Совпадение ожидаемого числа строк/столбцов и фактического.
- Отсутствие неожиданного увеличения числа строк (кроме целенаправленного продублирования).
- Нет критических NaN в ключевых полях после объединения.
Тестовые случаи (короткий набор)
- Совпадающие ключи в обеих таблицах → inner возвращает ожидаемые строки.
- Левый набор содержит дополнительные ключи → left сохраняет их с NaN в доп. полях.
- Дублирующиеся ключи в правой таблице → merge увеличивает число строк по правилам картезиана.
- Разные типы ключей → merge возвращает пустую таблицу по ключам (проверка типов).
Типичные ошибки при миграции и как их избежать
- При переносе из CSV/Excel столбцы могут быть считаны как float/int/str по-разному — явно задавайте dtype при чтении.
- Разные локали для дат: используйте parse_dates и dayfirst при pd.read_csv.
Краткое резюме
Pandas merge и concat покрывают большинство задач по объединению табличных данных: merge — для точного сопоставления по ключам, concat — для склеивания блоков. Всегда выполняйте предварительные проверки типов, уникальности и пробных объединений на подмножестве данных.
Ключевые действия: проверить → привести типы → выполнить тест → объединить → верифицировать.
Extras:
- Полезные альтернативы: join, combine_first, merge_asof, SQL, Dask.
- Ментальная модель: представьте множества и операции пересечения/объединения.
Важно: при больших объёмах данных оцените инструменты масштабирования и память. Хорошая практика — хранить промежуточные результаты и иметь контрольные точки восстановления.
Конец
Если вы только учитесь, попробуйте импортировать несколько Excel/CSV и попрактиковаться с merge и concat, следуя мини‑методике.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента