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.