2016-07-25 4 views
5

Ich habe zwei Datenframes mit jeweils unterschiedlicher Zeilenanzahl. Im Folgenden ein paar Zeilen aus jedem Datensatz istFuzzy-Matching über eine Datenrahmenspalte anwenden und Ergebnisse in einer neuen Spalte speichern

gesetzt
df1 = 
    Company         City   State ZIP 
    FREDDIE LEES AMERICAN GOURMET SAUCE  St. Louis MO  63101 
    CITYARCHRIVER 2015 FOUNDATION    St. Louis MO  63102 
    GLAXOSMITHKLINE CONSUMER HEALTHCARE  St. Louis MO  63102 
    LACKEY SHEET METAL      St. Louis MO  63102 

und

df2 = 
    FDA Company     FDA City FDA State FDA ZIP 
    LACKEY SHEET METAL    St. Louis MO   63102 
    PRIMUS STERILIZER COMPANY LLC Great Bend KS   67530 
    HELGET GAS PRODUCTS INC  Omaha  NE   68127 
    ORTHOQUEST LLC     La Vista NE   68128 

Ich trat sie nebeneinander combined_data = pandas.concat([df1, df2], axis = 1) verwenden. Mein nächstes Ziel ist es, jede Zeichenkette unter df1['Company'] mit jeder Zeichenkette unter df2['FDA Company'] zu vergleichen, indem mehrere verschiedene übereinstimmende Befehle vom Modul fuzzy wuzzy verwendet werden und der Wert der besten Übereinstimmung und seines Namens zurückgegeben wird. Ich möchte das in einer neuen Spalte speichern. Zum Beispiel, wenn ich habe die fuzz.ratio und fuzz.token_sort_ratio auf LACKY SHEET METAL in df1['Company']-df2['FDA Company'] würde es zurückgeben, dass die beste Übereinstimmung war LACKY SHEET METAL mit einer Punktzahl von 100 und dies würde dann unter einer neuen Spalte in combined data gespeichert werden. Es Ergebnisse aussehen würde

combined_data = 
    Company         City   State ZIP  FDA Company      FDA City FDA State FDA ZIP  fuzzy.token_sort_ratio match fuzzy.ratio   match 
    FREDDIE LEES AMERICAN GOURMET SAUCE  St. Louis MO  63101 LACKEY SHEET METAL    St. Louis MO   63102  LACKEY SHEET METAL  100  LACKEY SHEET METAL 100 
    CITYARCHRIVER 2015 FOUNDATION    St. Louis MO  63102 PRIMUS STERILIZER COMPANY LLC Great Bend KS   67530 
    GLAXOSMITHKLINE CONSUMER HEALTHCARE  St. Louis MO  63102 HELGET GAS PRODUCTS INC   Omaha  NE   68127 
    LACKEY SHEET METAL      St. Louis MO  63102 ORTHOQUEST LLC     La Vista NE   68128 

Ich versuchte

tun
combined_data['name_ratio'] = combined_data.apply(lambda x: fuzz.ratio(x['Company'], x['FDA Company']), axis = 1) 

bekam aber einen Fehler, da die Längen der Spalten unterschiedlich sind.

Ich bin ratlos. Wie kann ich das erreichen?

Antwort

7

Ich konnte nicht sagen, was Sie taten. So würde ich es machen.

from fuzzywuzzy import fuzz 
from fuzzywuzzy import process 

eine Reihe von Tupeln erstellen vergleichen:

compare = pd.MultiIndex.from_product([df1['Company'], 
             df2['FDA Company']]).to_series() 

eine spezielle Funktion erstellen Fuzzy-Metriken zu berechnen, und eine Reihe zurück.

def metrics(tup): 
    return pd.Series([fuzz.ratio(*tup), 
         fuzz.token_sort_ratio(*tup)], 
        ['ratio', 'token']) 

Bewerben metrics zur compare Serie

compare.apply(metrics) 

enter image description here

Es gibt Haufen von Möglichkeiten, diesen nächsten Teil zu tun:

am nächsten Spielen zu jeder Reihe von df1

Get
compare.apply(metrics).unstack().idxmax().unstack(0) 

enter image description here

Erhalten Sie am nächsten Spiele zu jeder Reihe von df2

compare.apply(metrics).unstack(0).idxmax().unstack(0) 

enter image description here

+0

Dies ist eine großartige Antwort! Aber für große Dateien (~ Lakhs) bekomme ich Speicherfehler – user1930402

Verwandte Themen