Нашли ошибку?
среднийpandas 3.0.6

merge: виды соединений

Объединить две таблицы по общему ключу, как JOIN в SQL, — и выбрать, какие строки оставить.

Нужно знать:DataFrameФильтрация строк

Содержание статьи

Коротко

  • left.merge(right, on="id") сопоставляет строки с одинаковым значением ключа и склеивает их столбцы.
  • how решает, какие строки попадут в результат: "inner" (по умолчанию) — только ключи из обеих таблиц; "left" / "right" — все строки одной из таблиц; "outer" — все ключи; "cross" — все сочетания.
  • Где пары не нашлось, появляется NaN.
  • Если ключ повторяется в обеих таблицах, строки размножаются: каждая с каждой.
  • Типы ключей должны совпадать: 2 и "2" — разные значения.

Синтаксис

left.merge(right, on="key", how="inner")
pd.merge(left, right, on=["k1", "k2"], how="left")
left.merge(right, how="cross")

Параметры

ПараметрЧто делаетПо умолчанию
rightвторая таблица (или именованный Series)обязательный
onстолбец-ключ или список столбцов, которые есть в обеих таблицахобщие столбцы
how"inner", "left", "right", "outer", "cross""inner"

Остальные параметры — ключи с разными именами, суффиксы, проверки — в статье merge: ключи и проверки.

Примеры

Данные для примеровиспользуются во всех примерах ниже
left = pd.DataFrame({"id": [1, 2, 3], "name": ["Аня", "Борис", "Вика"]})
right = pd.DataFrame({"id": [2, 3, 4], "city": ["Тула", "Сочи", "Омск"]})
inner — только общие ключи
left.merge(right, on="id")                     # how="inner" по умолчанию
Вывод
   id   name  city
0   2  Борис  Тула
1   3   Вика  Сочи
left — все строки левой
left.merge(right, on="id", how="left")
Вывод
   id   name  city
0   1    Аня   NaN
1   2  Борис  Тула
2   3   Вика  Сочи
right — все строки правой
left.merge(right, on="id", how="right")
Вывод
   id   name  city
0   2  Борис  Тула
1   3   Вика  Сочи
2   4    NaN  Омск
outer — все ключи
left.merge(right, on="id", how="outer")
Вывод
   id   name  city
0   1    Аня   NaN
1   2  Борис  Тула
2   3   Вика  Сочи
3   4    NaN  Омск
cross — все сочетания
sizes = pd.DataFrame({"size": ["S", "L"]})
drinks = pd.DataFrame({"drink": ["латте", "чай"]})
drinks.merge(sizes, how="cross")               # все сочетания
Вывод
   drink size
0  латте    S
1  латте    L
2    чай    S
3    чай    L
Подставить данные из справочника
orders = pd.DataFrame({"order": [10, 11, 12, 13], "id": [2, 2, 3, 5]})
orders.merge(left, on="id", how="left")        # подставить имя клиента в заказы
Вывод
   order  id   name
0     10   2  Борис
1     11   2  Борис
2     12   3   Вика
3     13   5    NaN

Самый частый случай: к таблице фактов (заказы) добавить атрибуты из справочника (клиенты) через how="left" — ни один заказ не потеряется.

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

Повторяющиеся ключи размножают строки

Если после merge строк стало больше, чем ожидалось, ключ не уникален в одной из таблиц. Проверяйте через validate= — см. ключи и проверки.

Ключ повторяется в обеих таблицах
a = pd.DataFrame({"key": ["x", "x"], "a": [1, 2]})
b = pd.DataFrame({"key": ["x", "x", "x"], "b": [10, 20, 30]})
a.merge(b, on="key")                           # 2 × 3 = 6 строк
Вывод
  key  a   b
0   x  1  10
1   x  1  20
2   x  1  30
3   x  2  10
4   x  2  20
5   x  2  30

Ключи разных типов

int и str в ключеошибка: ValueError
right_str = right.astype({"id": str})
left.merge(right_str, on="id")                 # 2 и "2" — разные значения
Ошибка
ValueError: You are trying to merge on int64 and str columns for key 'id'. If you wish to proceed you should use pd.concat

Приведите ключи к одному типу: right["id"] = right["id"].astype(int).