У меня есть 2 разных Dataframes, для которых я пытаюсь сопоставить строки столбцы (имена)
Ниже приведены лишь некоторые примеры DF
df1 (127000,3)
Code Name PostalCode
150 Maarc 47111
250 Kirc 41111
170 Moic 42111
140 Nirc 44111
550 Lacter 47111
df2 (38000,3)
Code NAME POSTAL_CODE
150 Marc 47111
250 Kikc 41111
170 Mosc 49111
140 NiKc 44111
550 Lacter 47111
Цель состоит в том, чтобы создать еще один DF3 как показано ниже
Code NAME Best Match Score
150 Marc Maarc 0.9
250 Karc Kirc 0.9
Следующий код дает ожидаемый результат
import difflib
from functools import partial
f = partial(difflib.get_close_matches, possibilities= df1['Name'].tolist(), n=1)
matches = df2['NAME'].map(f).str[0].fillna('')
scores = [difflib.SequenceMatcher(None, x, y).ratio()
for x, y in zip(matches, df2['NAME'])]
df3 = df2.assign(best=matches, score=scores)
df3.sort_values(by='score')
Задача
Чтобы сопоставить эти строки только для 2 строк, занимает около 30 с c. Эта задача должна быть выполнена для 1К строк, что займет несколько часов!
Вопрос
Как я могу ускорить код? Я думал о чем-то вроде fetchall?
РЕДАКТИРОВАТЬ
Были опробованы даже нечеткие библиотеки, что занимает больше времени, чем difflib со следующим кодом:
from fuzzywuzzy import fuzz
def get_fuzz(df, w):
s = df['Name'].apply(lambda y: fuzz.token_set_ratio(y, w))
idx = s.idxmax()
return {'Name': df['Name'].iloc[idx], 'CODE': df['Code'].iloc[idx], 'Value': s.max()}
df2['NAME'].apply(lambda x: get_fuzz(df1, x))
df2 = df2.assign(search= df2['NAME'].apply(lambda x: get_fuzz(df1, x)))