Короткий ответ
pd.concat по умолчанию выравнивает таблицы по названиям столбцов, заполняя NaN там, где столбец присутствует только в одной из таблиц, а индексы объединяемых таблиц сохраняются как есть, если не передать ignore_index=True.
Как это работает подробнее
concat(axis=0) объединяет строки по объединению (union) множества столбцов обеих таблиц; столбцы, отсутствующие в одной из таблиц, получают NaN в соответствующих строках; исходные индексы каждой таблицы сохраняются без изменений, из-за чего при одинаковых исходных индексах в результате появляются повторяющиеся метки.
Пример кода
Пример на Python
import pandas as pd
df1 = pd.DataFrame({'id': [1, 2], 'amount': [100, 200]})
df2 = pd.DataFrame({'id': [3, 4], 'Amount': [150, 250]})
combined = pd.concat([df1, df2], ignore_index=True)
print(combined)Что использовать на практике
- На практике. если таблицы должны иметь одинаковую структуру (например, данные за разные месяцы с одинаковой схемой), стоит заранее проверить набор столбцов (set(df1.columns) == set(df2.columns)), чтобы не получить неожиданные NaN из-за опечатки в названии столбца; ignore_index=True нужен почти всегда, если дальше планируется позиционный доступ или просто чистый диапазон индекса.
- Проверка. итоговая таблица будет содержать два отдельных столбца amount и Amount с NaN в "чужих" строках — это сразу видно по выводу и сигнализирует об опечатке в названии столбца, а не о реальном отсутствии данных.
Подводные камни
- Частые ошибки. не замечают, что из-за разного регистра или пробела в названии столбца (Amount vs amount) concat считает их разными столбцами и создаёт два столбца с NaN вместо одного; не используют ignore_index и затем получают неожиданные результаты при join/loc по дублирующимся меткам индекса.