Статья Автор: Деникина Н.В., Деникин А.В.

Двойники в архиве

Двойники в архиве

Если две строки совпадают по всем столбцам, ситуация понятна: перед нами полный дубль. Гораздо интереснее случаи, когда совпадает только имя, псевдоним или идентификатор. Здесь автоматическое удаление может уничтожить вполне реальные данные.

В исходной базе супергероев full_name уникален, а один и тот же alias может встречаться у разных персонажей. Значит, совпавший псевдоним ещё не делает записи дублями. Сначала нужно понять, что именно идентифицирует объект.

Компьютер видит символы, а не «одно и то же имя» "Pietro Storm" " Pietro Storm " "pietro storm" .str.strip().str.title() Pietro Storm После нормализации повторная проверка дублей может найти то, что раньше было скрыто
Одинаковое для человека может быть разным для программы

Строки "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"]) поэтому нужно остановиться и сформулировать смысл строки. Если анализируются итоговые состояния, возможно, понадобится последняя запись по времени. Если изучается история процесса, удалять их нельзя вообще.


Какие утверждения о повторяющихся записях верны?


Редкость тоже не повод для удаления

Та же осторожность нужна с редкими категориями. Частота помогает заметить опечатку: например, рядом с сотнями Earth внезапно появляется единственная earth . Но сама по себе редкость ничего не доказывает. Небольшая группа может быть реальной и как раз самой интересной для анализа.

Хорошая нормализация устраняет различия в записи, а не различия в смысле. Мы можем уверенно объединить значения, которые отличаются только пробелами или регистром, если знаем, что они обозначают одно и то же. Объединять разные категории только потому, что одна из них встречается редко, — уже содержательное решение, а не техническая очистка.

Теперь перейдём к другой маскировке. Иногда значение стоит в правильной строке и даже выглядит как число — но таблица всё равно понимает его не так, как мы.

Перейти к лаборатории «Спасти базу супергероев» →

Загрузка...
Чтобы оставить комментарий, необходимо авторизоваться
💬
Пока нет комментариев. Будьте первым!
Печать