Короткий ответ
merge объединяет две таблицы по значению общего ключа (как JOIN в SQL), а concat просто складывает таблицы друг под другом или рядом по индексу, без логики сопоставления по ключу.
Как это работает подробнее
merge ищет соответствия между строками по значениям столбцов и может менять число строк в результате; concat(axis=0) соединяет таблицы по строкам (аналог UNION, но без удаления дублей по умолчанию), а concat(axis=1) — по столбцам, выравнивая по индексу.
Пример кода
Пример Python
import pandas as pd
jan = pd.DataFrame({'day': [1, 2], 'sales': [100, 150]})
feb = pd.DataFrame({'day': [1, 2], 'sales': [120, 130]})
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)Что использовать на практике
- На практике: concat уместен, когда нужно просто "склеить" данные за разные периоды с одинаковой структурой столбцов (например, продажи за январь и февраль); merge нужен, когда данные о разных сущностях (заказы и пользователи) нужно связать по ключу.
- Проверка: итоговый DataFrame должен содержать 4 строки с непрерывным индексом 0..3, а не повторяющийся индекс 0,1,0,1.
Подводные камни
- Частые ошибки: используют concat там, где нужен merge, и получают механическое объединение строк без сопоставления по смыслу; при concat по строкам не используют ignore_index=True, из-за чего в результате появляются повторяющиеся значения индекса, что потом ломает последующий доступ по loc.