Нормализация названий объединила разные компании: найдём коллизии

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

Очистка не устанавливает личность

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