Определите единицу наблюдения
Представим учебную таблицу заказов: номер 101 имеет сумму 400, номер 102 сумму 600, ещё одна строка повторяет номер 102 и сумму 600, у номера 103 сумма отсутствует, у номера 104 указано 1000. Все числа условные. Если каждая строка должна представлять целый заказ, повтор номера 102 требует проверки. Но если таблица хранит отдельные позиции заказа, одинаковый номер может быть нормальным: внутри одного заказа несколько товаров. Поэтому удалять повторения по одному полю можно лишь после выяснения структуры данных. Полезный вопрос звучит так: какое сочетание столбцов должно однозначно определять именно эту запись? Ответ зависит от предмета таблицы, а не от удобства команды.
Сначала покажите повторения, затем решайте
В pandas метод duplicated помогает отметить повторяющиеся строки, а drop_duplicates позволяет их убрать. Параметр subset задаёт столбцы сравнения. По умолчанию сравниваются значения во всех столбцах, а параметр keep определяет, какое вхождение сохранить. Но выбор первого или последнего вхождения не равен поиску правильной версии. Если у одного номера указаны разные суммы, перед вами может быть исправление, частичная выгрузка или ошибка. Нужно понять происхождение записей. В нашем учебном примере дополнительно известно, что строка заказа 102 случайно загружена дважды. Тогда одну копию можно исключить. Сумма известных значений уменьшается с 2600 до 2000: формула не изменилась, изменился набор наблюдений.
Пропуск не является нулевой суммой
Отсутствующее значение заказа 103 означает, что сумма неизвестна в этой таблице. Оно не говорит, что заказ бесплатный. При стандартном вычислении среднего pandas обычно пропускает отсутствующие значения. После удаления подтверждённого дубля известны три суммы: 400, 600 и 1000. Их среднее составляет примерно 666,67. Это среднее по трём заказам с известной суммой, а не обязательно по всем четырём заказам. Если без основания заменить пропуск нулём, получится 500 и другой смысл показателя. Вместе с результатом полезно показывать число учтённых записей и количество пропусков. Сохраняйте исходную таблицу отдельно, а преобразования записывайте воспроизводимо. Тогда другой человек сможет понять, почему исчезла строка и какие данные не вошли в расчёт.
Попробуйте на практике
Проведите ручную проверку учебной таблицы перед автоматизацией на Python.
- Перепишите пять строк из примера с номерами 101, 102, 102, 103 и 104. Отметьте, что строка означает целый заказ, а повтор номера 102 подтверждён как случайная копия.
- Посчитайте число исходных строк и число уникальных заказов. Обведите повтор, но не приравнивайте пустую сумму заказа 103 к нулю.
- Исключите одну подтверждённую копию. Найдите сумму известных значений и среднее только по заполненным суммам. Запишите, сколько заказов участвовало в каждом расчёте.
- Составьте пояснение к итогу: сколько заказов осталось, у скольких сумма известна и почему одна строка удалена. Затем укажите, какие столбцы следовало бы использовать для поиска дублей.
Как проверить результат. Получены четыре уникальных заказа, три известные суммы, одна неизвестная и сумма известных значений 2000. Среднее примерно 666,67 сопровождается указанием, что оно рассчитано по трём заполненным значениям.
Частые вопросы
Можно ли удалять все одинаковые строки сразу?
Только если известно, что это лишние копии. Повторяющиеся значения иногда описывают разные реальные события. Сначала проверяют смысл строки и происхождение данных, затем выбирают правило удаления.
Почему важно сохранять число пропусков?
Без него итог выглядит полнее, чем исходные сведения. Два одинаковых средних могут быть рассчитаны по почти всей таблице или по небольшой заполненной части. Это существенно меняет интерпретацию результата.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.