Коротко
left.merge(right, on="id")сопоставляет строки с одинаковым значением ключа и склеивает их столбцы.howрешает, какие строки попадут в результат:"inner"(по умолчанию) — только ключи из обеих таблиц;"left"/"right"— все строки одной из таблиц;"outer"— все ключи;"cross"— все сочетания.- Где пары не нашлось, появляется
NaN. - Если ключ повторяется в обеих таблицах, строки размножаются: каждая с каждой.
- Типы ключей должны совпадать:
2и"2"— разные значения.
left
| id | name |
|---|---|
| 1 | Аня |
| 2 | Борис |
| 3 | Вика |
right
| id | city |
|---|---|
| 2 | Тула |
| 3 | Сочи |
| 4 | Омск |
how="inner" — только общие ключи| id | name | city |
|---|---|---|
| 2 | Борис | Тула |
| 3 | Вика | Сочи |
how="left" — все строки левой| id | name | city |
|---|---|---|
| 1 | Аня | NaN |
| 2 | Борис | Тула |
| 3 | Вика | Сочи |
how="right" — все строки правой| id | name | city |
|---|---|---|
| 2 | Борис | Тула |
| 3 | Вика | Сочи |
| 4 | NaN | Омск |
how="outer" — все ключи обеих| id | name | city |
|---|---|---|
| 1 | Аня | NaN |
| 2 | Борис | Тула |
| 3 | Вика | Сочи |
| 4 | NaN | Омск |
Синтаксис
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": ["Тула", "Сочи", "Омск"]})left.merge(right, on="id") # how="inner" по умолчаниюВывод
id name city 0 2 Борис Тула 1 3 Вика Сочи
left.merge(right, on="id", how="left")Вывод
id name city 0 1 Аня NaN 1 2 Борис Тула 2 3 Вика Сочи
left.merge(right, on="id", how="right")Вывод
id name city 0 2 Борис Тула 1 3 Вика Сочи 2 4 NaN Омск
left.merge(right, on="id", how="outer")Вывод
id name city 0 1 Аня NaN 1 2 Борис Тула 2 3 Вика Сочи 3 4 NaN Омск
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
Ключи разных типов
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).