Одна из самых частых путаниц в 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() полезен, когда у тебя уже выстроена логика через индекс.