Короткий ответ
inner оставляет только строки с совпадением ключа в обеих таблицах, left и right сохраняют все строки соответствующей таблицы (дополняя NaN там, где пары не нашлось), а outer сохраняет все строки из обеих таблиц.
Как это работает подробнее
при каждом типе соединения pandas сначала находит совпадения ключей между таблицами; inner отбрасывает несовпавшие строки с обеих сторон, left добавляет к ним все непарные строки левой таблицы с NaN в столбцах правой, right — симметрично, outer объединяет оба набора непарных строк.
Пример кода
question-120.py
import pandas as pd
orders = pd.DataFrame({'order_id': [1, 2, 3], 'user_id': [10, 20, 99]})
users = pd.DataFrame({'user_id': [10, 20], 'country': ['RU', 'US']})
left = pd.merge(orders, users, on='user_id', how='left')
print(left)Что использовать на практике
- Практика. left join часто используется, когда "главная" таблица — это, например, все заказы, а дополнительная информация о пользователе может отсутствовать для части из них; outer полезен для диагностики, чтобы увидеть все несовпадения сразу с обеих сторон.
- Проверка. итоговая таблица должна содержать все 3 заказа, при этом для user_id=99 (которого нет в users) столбец country будет NaN.
Подводные камни
- Частая ошибка. выбирают inner по умолчанию без явного размышления и теряют строки, которые по смыслу задачи должны были остаться (например, заказы без привязанного пользователя); не проверяют после merge количество новых NaN в добавленных столбцах, из-за чего пропуски, появившиеся из-за отсутствия пары, путают с пропусками, существовавшими изначально.