Как я могу улучшить производительность моего 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

0 ответов

Другие вопросы по тегам