Собесов

Сценарий: типы merge в pandas и как они влияют на размер результата

PythonPandas базовый workflowСредняяJunior

Условие

Есть orders(order_id, user_id, amount) и users(user_id, segment). Какие будут разницы между inner, left, right, outer join? Как понять, что merge неожиданно «размножил» строки?

Решение

Типы join

how Размер Когда
inner <= min(len) нужны только совпавшие
left >= len(orders) сохранить все заказы, добавить сегмент
right >= len(users) сохранить всех юзеров
outer >= max(len) full outer, диагностика расхождений

Защита от «размножения»

res = orders.merge(
    users,
    on='user_id',
    how='left',
    validate='m:1',   # many orders to one user
    indicator=True,   # колонка _merge: 'left_only' / 'both' / 'right_only'
)
 
# Сколько заказов не нашли пользователя:
res['_merge'].value_counts()

validate='m:1' упадёт с MergeError, если в users нашлись дубли по user_id.

Диагностика «зачем стало больше строк»

before = len(orders)
after = len(res)
print(after - before, 'extra rows')
print(users['user_id'].duplicated().sum(), 'duplicate users')

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

  1. Cartesian взрыв: если у обеих сторон по user_id есть дубли — получите m × n строк на ключ. Всегда validate=.
  2. NaN в ключе никогда не матчатся друг с другом (как и в SQL) — пропадут даже при inner.
  3. Разные типы ключа (int64 vs object) → 0 совпадений и пустой inner. Сверяйте dtype.
  4. После left join NaN в правых колонках означают не «нет данных», а «не нашёлся ключ» — это разные вещи.
  5. merge молчит, если ключ ничей — проверяйте indicator='_merge'.

Эталонный ответ

inner пересечение, left/right сохраняют свою сторону, outer объединение. Всегда указывайте validate= и indicator=True, чтобы поймать «размножение» строк и пропавшие ключи.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти