Гид по технологиям

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

• 6 min read • Python • Обновлено 18 Nov 2025
Слияние DataFrame в Pandas
Слияние DataFrame в Pandas

Зелёный питон, свернувшийся кольцом

Если вы используете 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”.

Фрагмент кода Jupyter Notebook с созданием DataFrame

Объединение 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')

Иллюстрация left merge

  • Right: сохраняет все строки из правого DataFrame.
right_merge = pd.merge(df1, df2, how='right', on='user_id')

Иллюстрация right merge

  • Inner: оставляет только совпадающие строки по ключу.
inner_merge = pd.merge(df1, df2, how='inner', on='user_id')

Иллюстрация inner merge

  • Outer: объединяет все строки из обоих DataFrame, заполняя NaN для отсутствующих значений.
outer_merge = pd.merge(df1, df2, how='outer', on='user_id')

Иллюстрация outer merge

Советы:

  • Всегда явно указывайте параметр 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:

  • concat по строкам не выравнивает по ключам — он просто добавляет строки.
  • Для выравнивания по ключам используйте merge или reindex после concat.

Когда merge или concat не работают: типичные ошибки и решения

  1. Неподходящие типы ключей
    • Символы/числа/NaN. Решение: привести столбцы к одному dtype с astype, например df[‘user_id’] = df[‘user_id’].astype(str).
  2. Дубликаты в ключах
    • Если ключ не уникален, merge породит больше строк (картезианское произведение для совпадающих ключей). Решение: агрегировать или убрать дубликаты заранее.
  3. Пропущенные значения
    • NaN в ключах обычно не совпадают. Решение: заполнить или фильтровать строки с NaN.
  4. Разные названия столбцов
    • Используйте left_on/right_on или переименуйте столбцы.
  5. Большие объёмы данных
    • Для сотен миллионов строк используйте Dask, Vaex или базу данных.

Альтернативные подходы и расширения

  • DataFrame.join — удобен, когда нужно объединять по индексу.
  • Series.combine_first — заполнить пропуски значениями из другой Series/DataFrame.
  • merge_asof — полезен для временных рядов (сопоставляет ближайшую предыдущую запись по времени).
  • SQL (sqlite/sqlalchemy) — когда операции проще выполнить в СУБД.
  • Dask/Modin — масштабирование на несколько ядер/кластер.

Ментальные модели (как выбирать тип объединения)

  • Left = «добавляю данные к основному списку».
  • Right = «добавляю данные к вспомогательному списку».
  • Inner = «хочу только совпадающие записи» (пересечение множеств).
  • Outer = «хочу все записи из обеих таблиц» (объединение множеств).

Мини‑методика: безопасный рабочий поток для объединений

  1. Проверить схемы (df.dtypes, df.columns).
  2. Проверить уникальность ключа (df[‘key’].is_unique).
  3. Привести типы ключей к общему типу.
  4. Выполнить тестовое объединение на небольшом срезе.
  5. Проверить количество строк и отсутствующие значения.
  6. Добавить суффиксы для конфликтующих столбцов.
  7. Зафиксировать преобразования и сохранить результат.

Шпаргалка: часто используемые сниппеты

  • Приведение типа ключа:
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 в ключевых полях после объединения.

Тестовые случаи (короткий набор)

  1. Совпадающие ключи в обеих таблицах → inner возвращает ожидаемые строки.
  2. Левый набор содержит дополнительные ключи → left сохраняет их с NaN в доп. полях.
  3. Дублирующиеся ключи в правой таблице → merge увеличивает число строк по правилам картезиана.
  4. Разные типы ключей → 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, следуя мини‑методике.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро