Одна из самых частых путаниц в pandas — это merge, join и concat. Все три метода что-то объединяют, но делают это по-разному.

Если коротко:

  • merge() — объединяет по ключам
  • join() — чаще объединяет по индексу
  • concat() — просто склеивает объекты по строкам или столбцам

merge: аналог SQL JOIN

merge() — это главный инструмент, если ты привык мыслить как в SQL.

Пример:

import pandas as pd

orders = pd.DataFrame({
    "customer_id": [1, 2, 3],
    "amount": [100, 200, 300]
})

customers = pd.DataFrame({
    "customer_id": [1, 2, 3],
    "name": ["Анна", "Борис", "Вика"]
})

result = orders.merge(customers, on="customer_id", how="left")

Здесь все очень похоже на SQL:

  • on — ключ соединения
  • how — тип join

Подходит для:

  • таблиц с общим ключом
  • обогащения данных
  • привычной логики left join, inner join

join: чаще про индекс

join() тоже объединяет данные, но чаще используется, когда ключ уже лежит в индексе.

orders = orders.set_index("customer_id")
customers = customers.set_index("customer_id")

result = orders.join(customers, how="left")

По смыслу это почти то же самое, что merge, но запись бывает короче, если работа идет через индекс.

Подходит для:

  • объединения по индексу
  • более короткой записи
  • пайплайнов, где индекс уже настроен

concat: не join, а склейка

concat() не сопоставляет строки по ключу как merge(). Он просто склеивает объекты.

Например, склеить два DataFrame вертикально:

jan = pd.DataFrame({"revenue": [100, 200]})
feb = pd.DataFrame({"revenue": [300, 400]})

result = pd.concat([jan, feb], axis=0)

Или склеить по столбцам:

left = pd.DataFrame({"a": [1, 2]})
right = pd.DataFrame({"b": [3, 4]})

result = pd.concat([left, right], axis=1)

Подходит для:

  • склейки нескольких файлов
  • объединения кусков данных по строкам
  • объединения нескольких таблиц по столбцам без логики SQL join

Как быстро понять, что использовать

Задай себе вопрос:

Есть общий ключ?

Если да, чаще всего нужен merge().

Работаешь через индекс?

Тогда может быть удобен join().

Надо просто сложить DataFrame друг под другом или рядом?

Тогда это concat().

Частая ошибка №1: использовать concat вместо merge

Например, человек хочет присоединить имена клиентов к заказам и пишет:

pd.concat([orders, customers], axis=1)

Проблема в том, что concat() не сопоставляет строки по customer_id. Он просто ставит таблицы рядом. Если порядок строк разный, результат будет неправильный.

Для такой задачи нужен merge().

Частая ошибка №2: забыть про дубликаты ключей в merge

Если в обеих таблицах ключ не уникален, результат может разрастись кратно.

Например:

  • в левой таблице по customer_id=1 две строки
  • в правой таблице по customer_id=1 три строки

После merge() получишь шесть строк.

Поэтому перед merge полезно проверять:

orders["customer_id"].value_counts()
customers["customer_id"].value_counts()

Частая ошибка №3: не понимать, что join работает по индексу

Если написать:

orders.join(customers)

то pandas по умолчанию попробует объединить по индексу, а не по столбцу customer_id.

И если индекс не тот, результат будет неожиданным.

Когда что использовать на практике

Шпаргалка:

  • аналог SQL join -> merge()
  • короткое объединение по индексу -> join()
  • склеить DataFrame по строкам или столбцам -> concat()

Итог

Хотя merge, join и concat часто ставят в один ряд, логика у них разная:

  • merge() — про связь по ключу
  • join() — чаще про индекс
  • concat() — про склейку объектов

Если ты аналитик и работаешь с табличными данными, merge() будет использоваться чаще всего. concat() — на втором месте. join() полезен, когда у тебя уже выстроена логика через индекс.