Коротко
pd.concat([df1, df2])ставит таблицы одну под другой; столбцы сопоставляются по именам.- Недостающие в какой-то таблице столбцы заполняются
NaN;join="inner"— оставить только общие. - Индексы сохраняются и могут повторяться — обычно передают
ignore_index=True. keys=[…]добавляет внешний уровень индекса — видно, из какой таблицы строка.axis=1— рядом, по совпадающему индексу. Для объединения по значениям столбца-ключа нужен merge.
Синтаксис
pd.concat(objs, axis=0, join="outer", ignore_index=False, keys=None)Параметры
ПараметрЧто делаетПо умолчанию
objsсписок таблиц или Seriesобязательныйaxis0 — одна под другой, 1 — рядом0join"outer" — все столбцы, "inner" — только общие"outer"ignore_indexновый индекс 0, 1, 2…Falsekeysметки частей для внешнего уровня индексаNoneПримеры
jan = pd.DataFrame({"city": ["Омск", "Тула"], "cups": [120, 95]})
feb = pd.DataFrame({"city": ["Омск", "Сочи"], "cups": [130, 60]})pd.concat([jan, feb]) # индекс повторяетсяВывод
city cups 0 Омск 120 1 Тула 95 0 Омск 130 1 Сочи 60
pd.concat([jan, feb], ignore_index=True)Вывод
city cups 0 Омск 120 1 Тула 95 2 Омск 130 3 Сочи 60
pd.concat([jan, feb], keys=["янв", "фев"]) # откуда строка — во внешнем уровне индексаВывод
city cups
янв 0 Омск 120
1 Тула 95
фев 0 Омск 130
1 Сочи 60extra = pd.DataFrame({"city": ["Пермь"], "rating": [4.7]})
pd.concat([jan, extra], ignore_index=True) # недостающие столбцы — NaNВывод
city cups rating 0 Омск 120.0 NaN 1 Тула 95.0 NaN 2 Пермь NaN 4.7
extra = pd.DataFrame({"city": ["Пермь"], "rating": [4.7]})
pd.concat([jan, extra], join="inner", ignore_index=True) # только общие столбцыВывод
city 0 Омск 1 Тула 2 Пермь
prices = pd.DataFrame({"price": [180, 165]})
pd.concat([jan, prices], axis=1) # рядом; строки сопоставляются по индексуВывод
city cups price 0 Омск 120 180 1 Тула 95 165
Подводные камни
concat в цикле
Каждый concat копирует все данные, поэтому склейка по одной строке в цикле работает за квадратичное время. Собирайте части в список и склеивайте один раз.
parts = []
for month, cups in [("янв", 120), ("фев", 130), ("мар", 110)]:
parts.append(pd.DataFrame({"month": [month], "cups": [cups]}))
pd.concat(parts, ignore_index=True) # собрать части в список и склеить один разВывод
month cups 0 янв 120 1 фев 130 2 мар 110
DataFrame.append удалён
jan.append(feb)Ошибка
AttributeError: 'DataFrame' object has no attribute 'append'