Короткий ответ
В pd.merge есть параметр validate (например, '1:1', '1:m', 'm:1', 'm:m'), который проверяет заявленный тип связи и выбрасывает понятную ошибку заранее, если реальные данные ему не соответствуют, вместо того чтобы молча вернуть неожиданный результат.
Как это работает подробнее
validate='one_to_one' проверяет, что ключ объединения уникален в обеих таблицах; validate='one_to_many' проверяет уникальность ключа только в левой таблице, допуская повторы в правой; при нарушении условия merge вместо выполнения операции выбрасывает MergeError с понятным сообщением.
Пример кода
question-134.py
import pandas as pd
orders = pd.DataFrame({'order_id': [1, 2, 3]})
addresses = pd.DataFrame({'order_id': [1, 1, 2]})
try:
pd.merge(orders, addresses, on='order_id', validate='one_to_one')
except Exception as e:
print(type(e).__name__, e)Что использовать на практике
- Практика. добавление validate — это дешёвая и полезная защитная проверка перед продакшен-пайплайнами и регулярными отчётами, особенно когда данные могут со временем измениться (появятся дубликаты ключа, которых раньше не было); это особенно важно при автоматизированных регулярных джойнах, где никто не смотрит на результат построчно.
- Проверка. вызов должен выбросить MergeError, явно сообщающий, что ключ order_id не уникален в правой таблице, что заранее предотвращает скрытое размножение строк.
Подводные камни
- Частая ошибка. считают validate избыточной "страховкой" и не используют её в продакшен-коде, из-за чего проблема с дублированием ключа обнаруживается только постфактум через искажённые бизнес-метрики; неправильно выбирают тип связи в validate (например, ставят '1:1', когда по природе данных связь должна быть '1:m'), получая ложные срабатывания ошибки на корректных данных.