Нормализация названий объединила разные компании: найдём коллизии
После удаления пробелов и смены регистра компаний стало меньше. Часть строк действительно была разным написанием одной компании. Но одинаковое очищенное название ещё не доказывает, что юридическое лицо одно и то же.
Очистка не устанавливает личность
Нормализация убирает различия оформления и помогает найти кандидатов на совпадение. Названия могут повторяться у разных компаний, магазинов и людей. Если сделать очищенный текст окончательным ключом merge, можно присоединить чужую выручку.
Сохраните исходное название, нормализованный кандидат и стабильный идентификатор. Первое объясняет преобразование, второе помогает искать, третье проверяет реальный объект. Когда id нет, неоднозначность требует отдельного решения, а не автоматического слияния.
Проверить число объектов за одним кандидатом
В примере разные написания «Маяк» относятся к id 10 и 20. Очистка делает ключ одинаковым. Считаем число разных id на ключ и выводим все строки проблемной группы, чтобы сохранить контекст.
Удаление кавычек, организационной формы и знаков тоже требует такого аудита. Чем агрессивнее очистка, тем больше потенциальных слияний. Не нужно добавлять эти операции просто ради максимального процента совпадений.
import pandas as pd
x = pd.DataFrame({"company_id": [10, 10, 20, 30],
"name": [" Маяк ", "МАЯК", "Маяк", "Вектор"]})
x["name_key"] = (x["name"].astype("string").str.strip()
.str.replace(r"\s+", " ", regex=True).str.casefold())
ids_per_key = x.groupby("name_key")["company_id"].nunique()
collisions = ids_per_key[ids_per_key.gt(1)].index
review = x[x["name_key"].isin(collisions)]
print(review.to_string(index=False))
assert collisions.tolist() == ["маяк"]
assert set(review["company_id"]) == {10, 20} and len(review) == 3В очереди три строки двух компаний. Первые две являются вариантами одного id; третью нельзя автоматически присоединить к ним. Отсутствие коллизии у «Вектора» не доказывает уникальность названия в будущих поставках.
Создать проверяемую таблицу соответствий
Для однозначных кандидатов сохраните основание сопоставления. Для коллизий используйте дополнительные поля: регистрационный номер, город, договор. Город сужает очередь, но сам по себе тоже не является универсальным ключом. Подтверждённое решение лучше хранить отдельной таблицей соответствий с версией.
Не превращайте пропуски в пустую строку до сопоставления. Все неизвестные названия тогда станут одним кандидатом. Строку из пробелов после очистки следует признать отсутствующим значением, если таков договор источника.
Считайте три результата: однозначное соответствие, отсутствие кандидата и коллизия. Один процент успешных совпадений способен улучшиться просто из-за ошибочных объединений. Для проверки качества нужна выборка пар с реальными идентификаторами.
После изменения правила очистки сравните пары id, которые впервые оказались вместе. Это предметный результат для ревью: видно, какие сущности новая нормализация предлагает слить. Общего снижения числа уникальных строк для такого решения недостаточно.
Закрепить на практике
В бесплатном уроке строковых методов вы отработаете нормализацию и разбор столбцов. Затем примените аудит из статьи: проверьте, не объединило ли правило разные идентификаторы. Откройте бесплатный урок и задачи. Полная последовательность тем — в бесплатном курсе.
Продолжить на практике
- NumPy и pandas: практический тренажёр ↗
Бесплатный тренажёр NumPy и pandas для тех, кто знает основы Python. Научитесь очищать таблицы, объединять данные и собирать отчёты: 31 урок и 124 задачи с кодом и автоматической проверкой.
