Pandas join

DataFrame.join объединяет две таблицы по индексу. По смыслу это удобная обёртка над pd.merge с настройками по умолчанию: левая таблица слева, объединение по своему индексу.

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

  • Таблицы уже имеют осмысленный общий индекс (ID устройства, дата).

  • Хочется компактного синтаксиса вместо pd.merge(..., left_index=True, right_index=True).

  • Нужно «приклеить» небольшой справочник к большому логу.

Пример 1. Базовое объединение

import pandas as pd

a = pd.DataFrame({"temp": [22, 35]}, index=["bot1", "bot2"])
b = pd.DataFrame({"owner": ["Aiten", "Beks"]}, index=["bot1", "bot2"])
print(a.join(b))

Output:

      temp  owner
bot1    22  Aiten
bot2    35   Beks

Пример 2. Left join по умолчанию

import pandas as pd

a = pd.DataFrame({"v": [1, 2]}, index=["x", "y"])
b = pd.DataFrame({"w": [10, 30]}, index=["x", "z"])
print(a.join(b))

Output:

   v     w
x  1  10.0
y  2   NaN

Пример 3. Outer

import pandas as pd

a = pd.DataFrame({"v": [1, 2]}, index=["x", "y"])
b = pd.DataFrame({"w": [10, 30]}, index=["x", "z"])
print(a.join(b, how="outer"))

Output:

     v     w
x  1.0  10.0
y  2.0   NaN
z  NaN  30.0

Пример 4. Join по столбцу левой

import pandas as pd

logs = pd.DataFrame({"device": ["bot1", "bot2"], "v": [10, 20]})
info = pd.DataFrame({"owner": ["Aiten", "Beks"]}, index=["bot1", "bot2"])
print(logs.join(info, on="device"))

Output:

  device   v  owner
0   bot1  10  Aiten
1   bot2  20   Beks

on="device" подставляет столбец из левой таблицы как ключ к индексу правой.

Пример 5. Несколько таблиц сразу

import pandas as pd

a = pd.DataFrame({"v1": [1, 2]}, index=["x", "y"])
b = pd.DataFrame({"v2": [10, 20]}, index=["x", "y"])
c = pd.DataFrame({"v3": [100, 200]}, index=["x", "y"])
print(a.join([b, c]))

Output:

   v1  v2   v3
x   1  10  100
y   2  20  200

Пример 6. Суффиксы при конфликте

import pandas as pd

a = pd.DataFrame({"v": [1, 2]}, index=["x", "y"])
b = pd.DataFrame({"v": [10, 20]}, index=["x", "y"])
print(a.join(b, lsuffix="_a", rsuffix="_b"))

Output:

   v_a  v_b
x    1   10
y    2   20

Пример 7. Join vs merge

Эквивалент через merge:

import pandas as pd

a = pd.DataFrame({"v": [1, 2]}, index=["x", "y"])
b = pd.DataFrame({"w": [10, 30]}, index=["x", "z"])
m = pd.merge(a, b, left_index=True, right_index=True, how="outer")
print(m)

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

  • Если у обеих таблиц есть столбец с одинаковым именем, join упадёт без lsuffix/rsuffix.

  • По умолчанию how="left" — отличается от pd.merge (inner).

  • Дубликаты в индексе раздувают результат — следите за is_unique.

См. также

Примечание

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

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