В КУРСЕ?

Разбираемся в теме

После merge сумма выросла: почему pandas размножил строки?

Объединение таблиц в Python может пройти без ошибки, а итоговая сумма неожиданно увеличиться. Частая причина состоит в том, что одному ключу слева соответствуют несколько строк справа. Операция создаёт все подходящие сочетания, и исходная сумма повторяется. Поэтому перед анализом результата полезно проверить не только названия столбцов, но и ожидаемую структуру связи между наборами данных.

Определите, что означает одна строка

Возьмём вымышленную таблицу заказов из двух строк. Заказ O1 относится к клиенту A и имеет сумму сто. Заказ O2 относится к клиенту B и имеет сумму двести. Общая сумма равна трёмстам. Во второй таблице хранятся сведения о клиентах: для A случайно записаны две строки с разными метками сегмента, для B одна. Предполагаемая задача состоит в добавлении одного сегмента к каждому заказу. Значит, в справочнике на одного клиента должна приходиться одна подходящая запись. Именно это предположение нужно проверить до объединения.

Посмотрите, какие пары создаёт объединение

При соединении по клиенту заказ O1 найдёт два соответствия для A. В результате появятся две строки с суммой сто. Заказ O2 найдёт одно соответствие и останется одной строкой с суммой двести. В итоговой таблице будет три строки, а механическое суммирование даст четыреста. pandas не добавил новый заказ: он выполнил объединение по заданным ключам. Ошибка находится в несоответствии фактической структуры данных ожидаемой. Такая ситуация особенно опасна, когда таблица выглядит правдоподобно, а проверяется только отсутствие программного исключения.

Задайте ожидание через validate

У merge есть параметр validate. Значение many_to_one проверяет уникальность ключей в правой таблице: множество строк слева может соответствовать одной записи справа. Для заказов и справочника клиентов это подходящее ожидание, если именно так определена модель данных. При повторении A справа проверка должна остановить объединение с ошибкой. Значение many_to_many не выполняет аналогичную проверку уникальности и потому не исправляет проблему. Оно лишь допускает связь с повторениями. Выбор режима следует из смысла таблиц, а не из желания убрать сообщение об ошибке.

Не удаляйте повторы без выяснения смысла

Две строки клиента могут быть случайным дублем, историей изменения сегмента или двумя действительными связями. В этих случаях нужны разные решения. Если хранится история, одного идентификатора клиента может быть недостаточно: требуется правило выбора записи на дату заказа. Если предполагается один текущий сегмент, нужно установить, какая запись актуальна. Слепое удаление первой попавшейся строки скрывает вопрос, а не решает его. После исправления проверяют количество заказов, суммы и отсутствие потерянных соответствий. Для левого объединения важно отдельно заметить клиентов, которым запись справочника не нашлась.

Попробуйте на практике

Вручную проверьте небольшое объединение, прежде чем повторять его в pandas.

  1. Запишите два заказа: O1, клиент A, сумма сто; O2, клиент B, сумма двести. Посчитайте исходную сумму.
  2. Создайте справочник из трёх строк: A с меткой первый, A с меткой второй, B с меткой третий. Найдите повторяющийся ключ.
  3. Для каждого заказа выпишите все совпадающие строки справочника. Посчитайте число строк и сумму после такого объединения.
  4. Объясните, почему ожидание many_to_one не выполнено. Сформулируйте вопрос к данным, который нужно решить до удаления одной из записей A.
  5. После условного исправления справочника до одной записи на клиента повторите объединение и сравните результат с исходными контрольными числами.

Как проверить результат. До исправления получаются три строки и сумма четыреста вместо трёхсот. После однозначного выбора одной записи на клиента остаются два заказа с общей суммой триста; причина выбора записи объяснена отдельно.

Частые вопросы

Повторение клиента в таблице заказов само по себе ошибка?

Нет. У одного клиента может быть несколько заказов. В связи many_to_one уникальность ожидается справа, в справочнике, а не обязательно слева.

Достаточно ли проверить только число строк после merge?

Нет. Полезно проверять также контрольные суммы, уникальность идентификаторов и отсутствующие соответствия. Иногда разные ошибки могут сохранить общее число строк, но изменить содержание результата.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов