2016-07-25 6 views
5

2つのデータフレームにそれぞれ異なる行数があります。以下は、各データからカップル行がデータフレーム列全体にファジーマッチングを適用し、結果を新しい列に保存します。

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 

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 

を設定し、私はcombined_data = pandas.concat([df1, df2], axis = 1)を使用してそれらを並べて接合されています。私の次の目標はモジュールからのいくつかの異なる一致するコマンドを使用してdf2['FDA Company']の下の各文字列にdf1['Company']の下の各文字列を比較し、最高の一致とその名前の値を返します。私は新しい列にそれを保存したい。私はdf2['FDA Company']df1['Company']LACKY SHEET METALfuzz.ratiofuzz.token_sort_ratioをした場合例えば、それは最高の試合は100のスコアでLACKY SHEET METALだったし、これはその後、combined dataの新しい列で保存されることを返します。それは

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 

私は

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

をやってみました。しかし、列の長さが異なっているため、エラーを得たように見える結果。

私は困惑しています。どのように私はこれを達成することができますか?

答えて

7

私はあなたがしていたことを伝えることができませんでした。これが私のやり方です。

from fuzzywuzzy import fuzz 
from fuzzywuzzy import process 

比較するのタプルのシリーズを作成します。

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

ファジーメトリックを計算し、シリーズを返すために、特別な関数を作成します。

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

compareシリーズにmetricsを適用

compare.apply(metrics) 

enter image description here

この次の部分を行う方法の束があります。

df1

の各行に最も近いマッチを取得
compare.apply(metrics).unstack().idxmax().unstack(0) 

enter image description here

これは素晴らしい答えですdf2

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

enter image description here

+0

の各行に最も近いマッチを入手!しかし、大きなファイル(〜lakhs)では、私はメモリエラーを取得 – user1930402

関連する問題