Как правильно стандартизировать тип адреса - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь стандартизировать уличный адрес путем преобразования сокращений в полное слово (например, RD - Road).Я создал много строк, чтобы учесть разные варианты написания, и столкнулся с проблемой, из-за которой один код замены заменил другой

import pandas as pd 

mydata = {'Street_type': ['PL', 'pl', 'Pl', 'PLACE', 'place']}
mydata = pd.DataFrame(mydata)

mydata['Street_type'] = mydata['Street_type'].replace('PL','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('pl','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('Pl','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('PLACE','Place',regex=True)
mydata['Street_type'] = mydata['Street_type'].replace('place','Place',regex=True)

Вместо Place, я получил Placeace.Каков наилучший способ избежать этой ошибки?Я пишу оператор if-else или какую-либо функцию?Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вы можете сделать это правильно за один проход, если используете правильное регулярное выражение, например, используйте границы слов (\ b):

In [11]: places = ["PL", "pl", "Pl", "PLACE", "Place", "place"]

In [12]: mydata.Street_type
Out[12]:
0       PL
1       pl
2       Pl
3    PLACE
4    place
Name: Street_type, dtype: object

In [13]: mydata.Street_type.replace("(^|\b)({})(\b|$)".format("|".join(places)), "Place", regex=True)
Out[13]:
0    Place
1    Place
2    Place
3    Place
4    Place
Name: Street_type, dtype: object
0 голосов
/ 18 июня 2018

Существует несколько готовых инструментов для стандартизации адресов, которые решают эту проблему и многие другие, которые неизбежно возникают в будущем.(Например, USPS распознает 189 суффиксов улиц, таких как RD, каждый с несколькими возможными сокращениями и орфографическими ошибками.) Компания, на которую я работаю, создает инструмент под названием YAddress .

0 голосов
/ 08 июня 2018

Среди других проблем у вас есть перекрывающаяся логика: вы не можете проверить, что целевая («старая») строка является полным словом, прежде чем заменить его.Например, с типом ввода «PLACE» вы запускаете как первую, так и третью замены, генерируя PlaceACE, а затем PlaceaceACE, прежде чем доберетесь до требуемого условия.

Вам необходимо пройти черезвнимательно следите за логикой отслеживания и исключения, а затем примените только одну замен.Вы можете проверить длину street_type и применить уникальный переход, необходимый для этой длины.

Если вы пытаетесь преобразовать оператор case, тогда вам нужно следовать этому логическому шаблону, а непоследовательные приложения, которые вы закодировали.Вы можете легко найти, как имитировать оператор "case" в Python.

Также рассмотрите возможность использования словаря перевода, такого как

type_trans = {
    "pl":    "Place",
    "Pl":    "Place",
    "PLACE": "Place",
    ...
}

Тогда ваше изменение просто

mydata['Street_type'] = type_trans[mydata['Street_type']]

Кроме того, вы можете перечислить все варианты в кортеже, например:

type_place = ("PL", "Pl", "pl", "PLACE", "place")
if mydata['Street_type'] in type_place
mydata['Street_type'] = "Place"

... но не забудьте обобщить это правильно для всего списка типов улиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...