Я пытаюсь найти потенциальные совпадения в столбце PANDAS, полном названий организаций. В настоящее время я использую iterrows(), но он очень медленный для фрейма данных с ~ 70 000 строк. После просмотра StackOverflow я попытался реализовать метод лямбда-строки (применить), но это, похоже, едва ускоряет работу, если вообще ускоряет.
Первые четыре строки фрейма данных выглядят так:
index org_name
0 cliftonlarsonallen llp minneapolis MN
1 loeb and troper llp newyork NY
2 dauby o'connor and zaleski llc carmel IN
3 wegner cpas llp madison WI
Следующий блок кода работает, но его обработка заняла около пяти дней:
org_list = df['org_name']
from fuzzywuzzy import process
for index, row in df.iterrows():
x = process.extract(row['org_name'], org_list, limit=2)[1]
if x[1]>93:
df.loc[index, 'fuzzy_match'] = x[0]
df.loc[index, 'fuzzy_match_score'] = x[1]
По сути, для каждой строки я сравниваю название организации со списком всех названий организаций, беру два верхних совпадения, затем выбираю второе наилучшее совпадение (поскольку верхнее совпадение будет таким же именем), а затем устанавливаю условие что оценка должна быть выше 93 для создания новых столбцов. Причина, по которой я создаю дополнительные столбцы, заключается в том, что я не хочу просто заменять значения — я хотел бы сначала перепроверить результаты.
Есть ли способ ускорить это? Я прочитал несколько сообщений в блогах и вопросы StackOverflow, в которых говорилось о «векторизации» этого кода, но мои попытки не увенчались успехом. Я также подумал о том, чтобы просто создать матрицу расстояний Левенштейна размером 70 000 x 70 000, а затем извлечь оттуда информацию. Есть ли более быстрый способ создать наилучшее соответствие для каждого элемента в списке или столбце PANDAS?
org_name
этой строки в качестве запроса, а затем использовать весь список названий организаций из полного столбцаorg_name
в качестве вариантов соответствия? - person rahlf23   schedule 03.10.2018