2016-07-25 8 views
5

Mam dwie ramki danych, z których każda ma inną liczbę wierszy. Poniżej jest kilka wierszy z każdego zestawu danychZastosuj dopasowanie rozmytą w kolumnie danych i zapisz wyniki w nowej kolumnie

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 

i

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 

dołączyłem je obok siebie przy użyciu combined_data = pandas.concat([df1, df2], axis = 1). Moim następnym celem jest porównanie każdego ciągu pod numerem df1['Company'] z każdym ciągiem pod numerem df2['FDA Company'] przy użyciu kilku różnych poleceń dopasowujących z modułu fuzzy wuzzy i zwrócenie wartości najlepszego dopasowania i jego nazwy. Chcę to zapisać w nowej kolumnie. Na przykład, jeśli zrobiłem fuzz.ratio i fuzz.token_sort_ratio na LACKY SHEET METAL w df1['Company'] do df2['FDA Company'] byłoby powrócić że najlepszy mecz był LACKY SHEET METAL z wynikiem 100 a to wtedy być zapisany pod nową kolumnę w combined data. Wynika to będzie wyglądać

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 

Próbowałem robić

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

Ale masz błąd, ponieważ długości kolumn są różne.

Jestem zaskoczony. Jak mogę to osiągnąć?

Odpowiedz

7

Nie mogłem powiedzieć, co robisz. Tak właśnie bym to zrobił.

from fuzzywuzzy import fuzz 
from fuzzywuzzy import process 

Tworzenie serię krotki porównać:

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

Tworzenie specjalnej funkcji do obliczania metryki rozmytej i powrotu serię.

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

Zastosuj metrics do serii compare

compare.apply(metrics) 

enter image description here

Istnieje kilka sposobów, aby to zrobić kolejną część:

Get najbliższe mecze na każdym rzędzie df1

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

enter image description here

Get najbliższe mecze do każdego wiersza z df2

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

enter image description here

+0

Jest to świetna odpowiedź! Ale w przypadku dużych plików (~ lakhs) dostaję błąd pamięci – user1930402

Powiązane problemy