Pandas merge

pd.merge объединяет две таблицы по общему ключу — почти как JOIN в SQL. Поддерживаются четыре основных типа: inner (только совпадения), left (все строки слева), right, outer (все строки из обеих).

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

  • Лог измерений + справочник устройств.

  • Сырые данные + калибровочные коэффициенты.

  • Соединение двух партий замеров по серийному номеру.

Пример 1. Inner join (по умолчанию)

import pandas as pd

logs = pd.DataFrame({"device": ["bot1", "bot2"], "temp": [22, 35]})
info = pd.DataFrame({"device": ["bot1", "bot3"], "owner": ["Aiten", "Beks"]})
print(pd.merge(logs, info, on="device"))

Output:

  device  temp  owner
0   bot1    22  Aiten

Остался только bot1 — он есть в обеих таблицах.

Пример 2. Left join

import pandas as pd

logs = pd.DataFrame({"device": ["bot1", "bot2"], "temp": [22, 35]})
info = pd.DataFrame({"device": ["bot1", "bot3"], "owner": ["Aiten", "Beks"]})
print(pd.merge(logs, info, on="device", how="left"))

Output:

  device  temp  owner
0   bot1    22  Aiten
1   bot2    35    NaN

Пример 3. Outer join

import pandas as pd

logs = pd.DataFrame({"device": ["bot1", "bot2"], "temp": [22, 35]})
info = pd.DataFrame({"device": ["bot1", "bot3"], "owner": ["Aiten", "Beks"]})
print(pd.merge(logs, info, on="device", how="outer"))

Output:

  device  temp  owner
0   bot1  22.0  Aiten
1   bot2  35.0    NaN
2   bot3   NaN   Beks

Пример 4. Разные имена ключей

import pandas as pd

a = pd.DataFrame({"id": [1, 2], "v": [10, 20]})
b = pd.DataFrame({"device_id": [1, 3], "name": ["bot1", "bot3"]})
print(pd.merge(a, b, left_on="id", right_on="device_id"))

Output:

   id   v  device_id  name
0   1  10          1  bot1

Пример 5. По нескольким ключам

import pandas as pd

a = pd.DataFrame({"d": ["bot1", "bot1"], "t": [0, 1], "v": [10, 11]})
b = pd.DataFrame({"d": ["bot1", "bot1"], "t": [0, 1], "cal": [0.95, 0.96]})
print(pd.merge(a, b, on=["d", "t"]))

Output:

      d  t   v   cal
0  bot1  0  10  0.95
1  bot1  1  11  0.96

Пример 6. indicator

import pandas as pd

a = pd.DataFrame({"k": [1, 2]})
b = pd.DataFrame({"k": [2, 3]})
print(pd.merge(a, b, on="k", how="outer", indicator=True))

Output:

   k      _merge
0  1   left_only
1  2        both
2  3  right_only

Удобно отлаживать, почему какая-то строка пропала или продублировалась.

Пример 7. Suffixes

import pandas as pd

a = pd.DataFrame({"id": [1, 2], "v": [10, 20]})
b = pd.DataFrame({"id": [1, 2], "v": [99, 88]})
print(pd.merge(a, b, on="id", suffixes=("_old", "_new")))

Output:

   id  v_old  v_new
0   1     10     99
1   2     20     88

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

  • Если ключ дублируется в обеих таблицах, размер результата = m*n — таблица «взрывается».

  • По умолчанию how="inner" — легко потерять строки, не заметив. Проверяйте shape после merge.

  • NaN в ключе не объединяется ни с чем (даже с другим NaN).

См. также

Примечание

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

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