Двойники в архиве
Если две строки совпадают по всем столбцам, ситуация понятна: перед нами полный дубль. Гораздо интереснее случаи, когда совпадает только имя, псевдоним или идентификатор. Здесь автоматическое удаление может уничтожить вполне реальные данные.
В исходной базе супергероев full_name уникален, а один и тот же alias может встречаться у разных персонажей. Значит, совпавший псевдоним ещё не делает записи дублями. Сначала нужно понять, что именно идентифицирует объект.
Одинаковое для человека может быть разным для программы
Строки "Pietro Storm", " Pietro Storm " и "pietro storm" для pandas различаются. Пробел и регистр — такие же символы, как остальные. Поэтому техническую форму строк часто приводят к единому виду до повторной проверки.
df["full_name"] = (
df["full_name"]
.astype("string")
.str.strip()
.str.title()
)
После нормализации полезно снова вызвать duplicated(). Иногда две записи становятся одинаковыми только теперь — и это как раз тот случай, когда техническое различие скрывало реальный повтор.
Но одинаковый ключ всё ещё не означает дубль
print(df.duplicated().sum())
same_name = df[
df.duplicated(subset=["full_name"], keep=False)
]
duplicated() без дополнительных параметров ищет полные повторы. Проверка только по full_name делает другое: показывает записи, которые стоит исследовать. Остальные поля могут различаться, и эти различия иногда имеют смысл.
Особенно хорошо это видно в журналах заказов, обращений или измерений. Один order_id может появляться несколько раз: сначала заказ создан, потом передан курьеру, затем доставлен. Это не три копии одного заказа, а три состояния объекта во времени.
same_object = (
df[df["object_id"] == target_id]
.sort_values("updated_at")
)
print(same_object)
Перед командой вроде drop_duplicates(subset=["object_id"]) поэтому нужно остановиться и сформулировать смысл строки. Если анализируются итоговые состояния, возможно, понадобится последняя запись по времени. Если изучается история процесса, удалять их нельзя вообще.