нечеткий, чтобы нормализовать строку в столбце панд - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть такой фрейм данных input dataframe

теперь я хочу нормализовать строку в столбце «комментарии» для слова «выборы». Я пытался использовать fuzzywuzzy, но не смог внедрить его в фрейм данных панд, чтобы частично соответствовать слову «выборы». Выходной фрейм данных должен иметь слово «выборы» в столбце «комментарии», например: output dataframe

Предположим, у меня около 100 тыс. Строк, и возможных комбинаций для слова «выборы» может быть много. Пожалуйста, наведите меня на эту часть.

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Не оперируйте с фреймом данных. Накладные расходы убьют вас. Превратите столбец в list, а затем повторите это. И, наконец, присвойте этот список колонке.

0 голосов
/ 29 апреля 2018

с ответом, который вы дали, вы можете использовать функции pandas apply, stack и groupby для ускорения вашего кода. у вас есть ввод, такой как:

import pandas as pd
from fuzzywuzzy import fuzz
df = pd.DataFrame({'Merchant details': ['Alpha co','Bravo co'],
                   'Comments':['electionsss are around',
                               'vote in eelecttions']}) 

Для столбца 'комментарии' вы можете создать временный DF mutiindex, содержащий слово в строке, разделив и используя stack функцию:

df_temp = pd.DataFrame(
    {'split_comments':df['Comments'].str.split(' ',expand=True).stack()})

Затем вы создаете столбец с исправленным словом (согласно вашей идее), используя apply и сравнение fuzz.ratio:

df_temp['corrected_comments'] = df_temp['split_comments'].apply(
    lambda wd: 'election' if fuzz.ratio(wd, 'election') > 75 else wd)

Наконец, вы записываете обратно в столбец Comments из df с исправленными данными, используя функции groupby и join:

df['Comments'] = df_temp.reset_index().groupby('level_0').apply(
    lambda wd: ' '.join(wd['corrected_comments']))
0 голосов
/ 28 апреля 2018

Хорошо, я попробовал это сам и придумал этот код -

for i in range(len(df)):
a = []
a = df.comments[i].split()
for j in word:
    for k in range(len(a)):
        if fuzz.ratio(j,a[k]) > 75:
            a[k] = j
df.comments[i] = a
df.comments[i] = ' '.join(df.comments[i])

Но этот подход кажется медленным для большого фрейма данных. Может ли кто-нибудь предоставить лучший питонский способ реализации этого.

...