проблемы производительности при применении двойных лямбда-функций - PullRequest
0 голосов
/ 18 октября 2019

У меня есть два кадра данных: df1, df2, которые содержат каждый столбец с именами. Я сравниваю каждое имя в df1 с каждым именем в df2. Это должно быть приблизительное совпадение. Я использую fuzzywuzzy token_sort_ratio, чтобы получить результат сравнения.

Однако этот метод очень медленный и df2 продолжает расти, это уже занимает больше получаса (4k x 2k строк). Есть ли способ ускорить процесс?

Моя текущая реализация:

def match(df2,name):
    df2['score'] = df2['name'].map(lambda x: fuzz.token_sort_ratio(x, name))
        return df2.loc[(df2['score'].idxmax())

df1['result']=df1['name'].map(lambda x: match(df2,x))


1 Ответ

1 голос
/ 18 октября 2019

Вы можете попробовать это,

from fuzzywuzzy import fuzz

def similarity(name1, name2):
    return fuzz.token_sort_ratio(name1, name2)

df1['key'] = 1
df2['key'] = 1
merged = df1.merge(df2, on='key')

merged['name_score'] = merged[['name_x', 'name_y']] \
    .apply(lambda row: similarity(row['name_x'], row['name_y']), axis=1)

или

from fuzzywuzzy import fuzz

def similarity(name1, name2):
    return fuzz.token_sort_ratio(name1, name2)

df1['key'] = 1
df2['key'] = 1
merged = df1.merge(df2, on='key')

scores = list(map(similarity, merged['name_x'], merged['name_y']))
merged['name_score'] = scores
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...