Pandas concat

pd.concat склеивает несколько DataFrame или Series по строкам (axis=0) или по столбцам (axis=1). В отличие от merge, общий ключ здесь не нужен — Pandas просто выравнивает данные по индексу/столбцам.

Когда использовать

  • Слить логи с нескольких устройств в один.

  • Добавить новые записи к старой таблице.

  • Поставить рядом две версии одного измерения для сравнения.

Пример 1. Склейка по строкам

import pandas as pd

a = pd.DataFrame({"v": [1, 2]})
b = pd.DataFrame({"v": [3, 4]})
print(pd.concat([a, b]))

Output:

   v
0  1
1  2
0  3
1  4

Индексы повторились — это сюрприз.

Пример 2. ignore_index=True

import pandas as pd

a = pd.DataFrame({"v": [1, 2]})
b = pd.DataFrame({"v": [3, 4]})
print(pd.concat([a, b], ignore_index=True))

Output:

   v
0  1
1  2
2  3
3  4

Пример 3. По столбцам

import pandas as pd

a = pd.DataFrame({"a": [1, 2]})
b = pd.DataFrame({"b": [10, 20]})
print(pd.concat([a, b], axis=1))

Output:

   a   b
0  1  10
1  2  20

Пример 4. Разные столбцы

import pandas as pd

a = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
b = pd.DataFrame({"b": [5, 6], "c": [7, 8]})
print(pd.concat([a, b], ignore_index=True))

Output:

     a  b    c
0  1.0  3  NaN
1  2.0  4  NaN
2  NaN  5  7.0
3  NaN  6  8.0

Недостающие значения заполнены NaN.

Пример 5. join="inner"

import pandas as pd

a = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
b = pd.DataFrame({"b": [5, 6], "c": [7, 8]})
print(pd.concat([a, b], join="inner", ignore_index=True))

Output:

   b
0  3
1  4
2  5
3  6

Остался только общий столбец.

Пример 6. Метки источника через keys

import pandas as pd

a = pd.DataFrame({"v": [1, 2]})
b = pd.DataFrame({"v": [3, 4]})
print(pd.concat([a, b], keys=["bot1", "bot2"]))

Output:

        v
bot1 0  1
     1  2
bot2 0  3
     1  4

Получился MultiIndex — удобно для дальнейшего groupby.

Пример 7. Series вместо столбцов

import pandas as pd

s1 = pd.Series([1, 2], name="a")
s2 = pd.Series([10, 20], name="b")
print(pd.concat([s1, s2], axis=1))

Output:

   a   b
0  1  10
1  2  20

Подводные камни

  • По умолчанию concat сохраняет старые индексы — после этого их часто нужно сбрасывать.

  • Конкатенация большого числа маленьких DataFrame медленная — лучше собрать в список и сделать один concat, чем приклеивать по одному.

  • Типы столбцов могут «расшириться» до object, если в разных кусках они отличаются.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.