Проблема

result = pd.merge(orders, products, on='product_id', how='left')

Что если в products дубликаты по product_id? result будет больше orders. Метрика SUM(revenue) станет в 2-3 раза больше.

Решение: validate

result = pd.merge(
    orders, products,
    on='product_id',
    how='left',
    validate='many_to_one'
)

Возможные значения:

  • one_to_one — обе стороны без дубликатов
  • one_to_many — слева 1:1, справа может быть много
  • many_to_one — слева может быть много, справа 1:1
  • many_to_many — никаких гарантий

indicator для проверки полноты

df = pd.merge(orders, users, on='user_id', how='left', indicator=True)
df._merge.value_counts()
# both          850000
# left_only      50000  ← orphans

Кейс из Kaspi Shop

Аналитик объединял orders × products × categories. Случайно products содержал 3 строки на один SKU. Result раздулся в 3 раза, отчёт показал revenue 30M вместо реальных 10M. CFO принял решение об инвестициях на этих данных.

После инцидента ввели правило: каждый merge() обязан иметь validate параметр.