Найти и заменить в DataFrame, используя Pandas оптимизированным способом - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь найти и заменить слова из комментариев 20K.Слова поиска и замены хранятся в фрейме данных, и его количество составляет более 20000. Комментарии в разных фреймах данных составляют около 20 тыс.

Ниже приведен пример

import pandas as pd

df1 = pd.DataFrame({'Data' : ["Hull Damage happened and its insured by maritime hull insurence company","Non Cash Entry and claims are blocked"]})

df2 = pd.DataFrame({ 'Find' : ["Insurence","Non cash entry"],
                    'Replace' : ["Insurance","Blocked"],
                       }) 

И я ожидаю вывод ниже

op = ["Hull Damage happened and its insured by maritime hull insurance company","Blocked and claims are blocked"]})

Пожалуйста, помогите.

Я использую цикл, но на это уходит более 20 минут.20 k записей в данных, 30000 слов для замены

"" KeywordSynonym "" - Dataframe содержит данные поиска и замены в sql
"" backup "" - Dataframe содержит данные, которые необходимо очистить

backup = str(backup)
TrainingClaimNotes_KwdSyn = []
for index,row in KeywordSynonym.iterrows():
    word = KeywordSynonym.Synonym[index].lower()
    value = KeywordSynonym.Keyword[index].lower()
    my_regex = r"\b(?=\w)" + re.escape(word) + r"\b(?!\w)" 
    if re.search(my_regex,backup):
        backup = re.sub(my_regex, value, backup) 
    TrainingClaimNotes_KwdSyn.append(backup)

TrainingClaimNotes_KwdSyn_Cmp = backup.split('\'", "\'') 

1 Ответ

0 голосов
/ 24 сентября 2018

Использование:

import pandas as pd

df1 = pd.DataFrame({'Data' : ["Hull Damage happened and its insured by maritime hull insurence company","Non Cash Entry and claims are blocked"]})

df2 = pd.DataFrame({ 'Find' : ["Insurence","Non cash entry"],
                    'Replace' : ["Insurance","Blocked"],
                       }) 

find_repl = dict(zip(df2['Find'].str.lower(), df2['Replace'].str.lower()))
d2 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in find_repl.items()}

df1['Data_1'] = df1['Data'].str.lower().replace(d2, regex=True)

Вывод

>>> print(df1['Data_1'].tolist())
['hull damage happened and its insured by maritime hull insurance company', 'blocked and claims are blocked']

Пояснение

dict(zip(df2['Find'].str.lower(), df2['Replace'].str.lower())) создает отображение междуто, что вы хотите заменить, и строку, которую вы хотите заменить -

{'insurence': 'insurance', 'non cash entry': 'blocked'}

Преобразовать поиски в regex, чтобы подготовить их к поиску -

d2 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in find_repl.items()}

{'(\\b)insurence(\\b)': '\\1insurance\\2', '(\\b)non cash entry(\\b)': '\\1blocked\\2'}

Последняя часть просто делает фактическую замену -

df1['Data_1'] = df1['Data'].str.lower().replace(d2, regex=True)

Примечание: я сделал .lower() везде, чтобы найти подходящие совпадения.Очевидно, вы можете изменить его так, как вы хотите.

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