Как я могу улучшить производительность моего apply() с помощью оператора нечеткого соответствия
Я написал функцию muzz, которая использует модуль fuzzywuzzy для "объединения" двух фреймов данных панд. Прекрасно работает, но на больших кадрах производительность довольно плохая. Пожалуйста, посмотрите на мой apply(), который выполняет извлечение / оценку, и дайте мне знать, если у вас есть идеи, которые могли бы ускорить его.
import pandas as pd
import numpy as np
import fuzzywuzzy as fw
Создать кадр необработанных данных
dfRaw = pd.DataFrame({'City': {0: u'St Louis',
1: 'Omaha',
2: 'Chicogo',
3: 'Kansas city',
4: 'Des Moine'},
'State' : {0: 'MO', 1: 'NE', 2 : 'IL', 3 : 'MO', 4 : 'IA'}})
Который дает
City State
0 St Louis MO
1 Omaha NE
2 Chicogo IL
3 Kansas city MO
4 Des Moine IA
Затем кадр, который представляет хорошие данные, которые мы хотим посмотреть
dfLocations = pd.DataFrame({'City': {0: 'Saint Louis',
1: u'Omaha',
2: u'Chicago',
3: u'Kansas City',
4: u'Des Moines'},
'State' : {0: 'MO', 1: 'NE', 2 : 'IL',
3 : 'KS', 4 : 'IA'},
u'Zip': {0: '63201', 1: '68104', 2: '60290',
3: '68101', 4: '50301'}})
Который дает
City State Zip
0 Saint Louis MO 63201
1 Omaha NE 68104
2 Chicago IL 60290
3 Kansas City KS 68101
4 Des Moines IA 50301
и теперь функция намордника. РЕДАКТИРОВАТЬ: Добавлена опция choices = right [match_col_name] и использованы варианты в предложении применить к Brenbarn. Я также, по предложению Бренбарна, провел несколько тестов с помощью extractOne() без применения, и это оказалось узким местом. Может быть, есть более быстрый способ сделать нечеткое сопоставление?
def muzz(left, right, on, match_col_name='match_on',score_col_name='score_match',
right_suffix='_match', score_cutoff=80):
right[match_col_name] = np.sum(right[on],axis=1)
choices= right[match_col_name]
###The offending statement###
left[[match_col_name,score_col_name]] =
pd.Series(np.sum(left[on],axis=1)).apply(lambda x : pd.Series(
fw.process.extractOne(x,choices,score_cutoff=score_cutoff)))
dfTemp = pd.merge(left,right,how='left',on=match_col_name,suffixes=('',right_suffix))
return dfTemp.drop(match_col_name, axis=1)
Зовет морда
muzz(dfRaw.copy(),dfLocations,on=['City','State'], score_cutoff=85)
Который дает
City State score_match City_match State_match Zip
0 St Louis MO 87 Saint Louis MO 63201
1 Omaha NE 100 Omaha NE 68104
2 Chicogo IL 89 Chicago IL 60290
3 Kansas city MO NaN NaN NaN NaN
4 Des Moine IA 96 Des Moines IA 50301