Слить orders с customers так, чтобы дубль ключа не размножил строки и не раздул сумму — как?
orders (одна строка на заказ, со столбцом amount) сливается с customers по customer_id, чтобы добавить region. Дубль customer_id в customers размножит заказы и раздует SUM(amount). Слейте так, чтобы fan-out падал явно, и пометьте несопоставленные заказы.
import pandas as pd
def merge_safe(orders: pd.DataFrame, customers: pd.DataFrame) -> pd.DataFrame:
# ваш код здесь
Напишите реализацию.
Передайте validate='many_to_one': pandas проверяет уникальность правого ключа и на fan-out кидает MergeError, а не молча размножает заказы и раздувает SUM(amount). Добавьте indicator=True и фильтр _merge == 'left_only' для несопоставленных — оба ловят это в момент merge.
- ✗Считать, что один left join уже спасает от fan-out по дублям правого ключа
- ✗Путать направление validate (здесь берут
one_to_many) - ✗Искать несопоставленные заказы в
right_only, а не вleft_only
- →Что именно проверяет
validate='one_to_one'в отличие отmany_to_one? - →Как дедуплицировать
customers, если fan-out ожидаем, но нежелателен?
validate='many_to_one' asserts the right key is unique, so a duplicate customer_id raises MergeError at merge time rather than fanning the orders out and inflating the total. indicator=True adds a _merge column; 'left_only' rows are orders with no matching customer.
import pandas as pd
def merge_safe(orders: pd.DataFrame, customers: pd.DataFrame) -> pd.DataFrame:
return orders.merge(
customers[['customer_id', 'region']],
on='customer_id',
how='left',
validate='many_to_one',
indicator=True,
)
Audit the unmatched orders with result[result['_merge'] == 'left_only'] before dropping the _merge column.