Применить fuzzywuzzy к pandas df с большим количеством имен - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть df, который выглядит примерно так:

Name                |Address | State | Phone | Website
--------------------------------------------------------
agua calienta       |etc etc etc
agua caliente       |
blue lake           |
blue lake club      |
artichoke           |
artichoke club      |
creek club          |
cahuilla creek      |
cahuilla crek resort|
taj club            |
taj mahal           |
taj mahal club hotel|

и т. Д.
Название - это название курорта / отеля, однако в нем есть много опечаток и вариаций названий. данные. Используя расстояние Левенштейна и пакет fuzzywuzzy, я смог получить все похожие имена, набрав

choices = df['Name'].unique()

def get_ratio(row):
    name = row['Name']
    return fuzz.token_sort_ratio(name, 'agua caliente')

df[df.apply(get_ratio, axis = 1) > 60]

Затем я мог гипотетически переименовать все имена со счетом выше 60, используя

df.loc[df.apply(get_ratio, axis=1) > 75, "Name"] = "Agua Caliente"

Однако это работает только для 1 имени, которое я использовал.

Есть ли способ применить это ко всем именам, которые похожи?
Например, после применения я получил бы что-то похожее на следующее:

Name                |Address | State | Phone | Website
--------------------------------------------------------
Agua Caliente       |etc etc etc
Agua Caliente       |
Blue Lake Club      |
Blue Lake Club      |
Artichoke Club      |
Artichoke Club      |
Creek Club          |
Cahuilla Resort     |
Cahuilla Resort     |
Taj Mahal           |
Taj Mahal           |
Taj Mahal           |

У меня есть список ссылок / таблица всех возможных имен. Как мне выполнить oop и применить функцию get_ratio к go через список и вернуть все похожие имена в списке?

1 Ответ

0 голосов
/ 21 февраля 2020

Вам потребуется полный список правильных имен.

taj club            
taj mahal           
taj mahal club hotel

Вам потребуется справочная таблица (или список правил) с правильными именами. В приведенном выше примере поле справочной таблицы должно быть Taj Mahal, а не taj club или taj mahal club hotel.

. Исходя из этого, вы будете использовать упомянутые вами подходы, например fuzzywuzzy и Расстояние Левенштейна. К сожалению, не зная правильной ссылки (в данном случае «Тадж-Махал»), не существует точного способа применить функцию, чтобы угадать правильную ссылку. Это подход, основанный на правилах, который вы должны будете принять.

Дополнительно

Для комментариев вам необходимо создать функцию, которая сравнивает ее с вашей справочной таблицей. и получает счет, а затем возвращает название правильного города.

Пример:

def replace_name(name_of_city: str):
    #
    # Extra code to look up your reference table
    # and find the correct city name (with the lowest or highest
    # score) depending on your methodology

    return name_of_correct_city

, затем сопоставьте эту функцию со всем столбцом Name в вашем фрейме данных, например:

df['Name'] = df['Name'].map(lambda x: replace_name(x))

Надеюсь, это поможет.

...