Функция merge() в pandas: соединение таблиц (join)

pd.merge(left, right, on=ключ, how=тип) соединяет два DataFrame по общему ключу — это pandas-аналог SQL JOIN. Параметр how задаёт тип: inner (только совпадения), left (все строки левой), outer (объединение), right. Аналитик использует merge, чтобы подтянуть к событиям атрибуты пользователя, к заказам — данные товара.

Синтаксис

pd.merge(left, right, on='ключ', how='inner'|'left'|'outer', indicator=True)

Примеры использования

Пример 1: Left join с indicator: кто без пары

m = crm.merge(pay, on='user_id', how='left', indicator=True)
m[m['_merge'] == 'left_only']['user_id']

Результат:

1    2
2    4
Name: user_id

Пример 2: Дедуп ключа перед merge, чтобы не раздуть строки

orders.merge(prices.drop_duplicates('sku'), on='sku', how='left')

Результат:

(fan-out устранён — по одной цене на sku)
Порешать Python-задачи в тренажёре →

Типичная ошибка

Главная ловушка — fan-out: если в правой таблице ключ не уникален, merge размножит строки левой (связь один-ко-многим), и суммы задвоятся. Перед left join делай drop_duplicates по ключу или проверяй validate='m:1'. indicator=True добавляет колонку _merge (both/left_only/right_only) — удобно для анти-join. Если имена ключей разные — left_on/right_on.

Где спрашивают на собеседовании

merge и типы join — обязательный вопрос. Спрашивают разницу inner/left/outer, как найти строки без пары (how='left' + _merge=='left_only') и как избежать дублей при fan-out. Часто просят объяснить связь с SQL JOIN.

FAQ: частые вопросы про merge

Чем merge отличается от join и concat?

merge соединяет по значению колонок-ключей (как SQL JOIN). df.join склеивает по индексу. concat просто «сшивает» таблицы по оси (сверху-вниз или слева-направо) без сопоставления ключей.

Почему после merge стало больше строк?

Это fan-out: ключ в правой таблице не уникален, и каждая левая строка размножилась под все совпадения. Убери дубли (drop_duplicates по ключу) или используй validate='m:1' для контроля.

Как сделать анти-join в pandas?

merge с how='left', indicator=True, затем фильтр _merge == 'left_only' — это строки левой таблицы без пары в правой.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas merge / join · Pandas: основы

Другие функции pandas

groupby · pivot_table · apply · value_counts · drop_duplicates · fillna

Открыть Python-тренажёр (556 задач) →