wie kann man viele (Fuzzy-) Zeichenkettenvergleiche mit apply in Pandas parallelisieren?
Ich habe das folgende Problem
Ich habe einen DatenrahmenMeiste das Sätze enthält, wie zB
master
Out[8]:
original
0 this is a nice sentence
1 this is another one
2 stackoverflow is nice
Für jede Zeile im Master schaue ich in einem anderen Dataframe nach slave für die beste Übereinstimmung mitfuzzywuzzy
. Ich verwende fuzzywuzzy, da die übereinstimmenden Sätze zwischen den beiden Datenrahmen sich geringfügig unterscheiden können (zusätzliche Zeichen usw.).
Zum Beispiel, slave könnte sei
slave
Out[10]:
my_value name
0 2 hello world
1 1 congratulations
2 2 this is a nice sentence
3 3 this is another one
4 1 stackoverflow is nice
Hier ist ein voll funktionsfähiges, wunderbares, kompaktes Arbeitsbeispiel:)
from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np
import difflib
master= pd.DataFrame({'original':['this is a nice sentence',
'this is another one',
'stackoverflow is nice']})
slave= pd.DataFrame({'name':['hello world',
'congratulations',
'this is a nice sentence ',
'this is another one',
'stackoverflow is nice'],'my_value': [2,1,2,3,1]})
def fuzzy_score(str1, str2):
return fuzz.token_set_ratio(str1, str2)
def helper(orig_string, slave_df):
#use fuzzywuzzy to see how close original and name are
slave_df['score'] = slave_df.name.apply(lambda x: fuzzy_score(x,orig_string))
#return my_value corresponding to the highest score
return slave_df.ix[slave_df.score.idxmax(),'my_value']
master['my_value'] = master.original.apply(lambda x: helper(x,slave))
Die 1-Millionen-Dollar-Frage lautet: Kann ich meinen oben genannten Apply-Code parallelisieren?
mmerhin jede Zeile inmaster
wird mit allen Zeilen in @ verglichslave
(Slave ist ein kleiner Datensatz und ich kann viele Kopien der Daten im RAM speichern.)
Ich verstehe nicht, warum ich nicht mehrere Vergleiche durchführen konnte (d. H. Mehrere Zeilen gleichzeitig verarbeiten).
Problem: Ich weiß nicht, wie das geht oder ob das überhaupt möglich ist.
Jede Hilfe sehr geschätzt!