2017-05-11 8 views
0

2つの列の文字列データをそれぞれ2つ含むDataFrameオブジェクトがあります。 abの列をcdと比較し、最も高い一致率に基づいて2つのDataFrameオブジェクトをマージする必要があります。Python Pandas - 各値と戻り値のクローズマッチのSequenceMatch列

DF1        DF2 
a  b       c  d 
apple paster      doser ankle 
bac bur       are  bun 
sit sign      and  lake 
car bun       ape  mason 
alli makeup      noodle paster 

出力例

  RESULT        
a  b  c  d  comparison_ratio 
apple paster noodle paster 1 
bac bur  are  bun  0.95 
sit sign and  lake  random number based on match 
car bun  are  bun  1 
alli makeup noodle paster random number based on match 

が明らかに比率が完全に一致するとは別に作られ1.

私は、各DataFrameオブジェクトの各ラインをループして、返すためにdifflib.SequenceMatcher関数を適用することができ比率を計算し、対応するデータと共に最大比をとってその行の値を設定しますが、データの大きさを考えると非常に長い時間がかかります。私は何とか2つのDataFrameオブジェクト間で

答えて

0

を、この機能を適用するためにapplyを使用できる場合、私は好奇心(元df2間の出力変化と出力例の一部をしましたか?私は例の出力は、正しいdf2を持っていると仮定しています。 )acbdを行単位でペア設定しているようですので、最初にデータフレームを連結してみましょう。

import pandas as pd 
from difflib import SequenceMatcher 

df1 = pd.DataFrame({'a': ['apple', 'bac', 'sit', 'car', 'alli'], 
        'b': ['paster', 'bur', 'sign', 'bun', 'makeup']}) 

df2 = pd.DataFrame({'c': ['noodle', 'are', 'and', 'ape', 'noodle'], 
        'd': ['paster', 'bun', 'lake', 'bun', 'paster']}) 

df = pd.concat([df1, df2], axis=1) 

2つの列を取るapplyを実行する必要があります。 2つの列名を引数として取る関数を作成する必要があります。

def sim_metric(df, col1, col2): 
    return SequenceMatcher(None, df[col1], df[col2]).ratio() 

SequenceMatcherの仕組みを調べる必要がありました。注目すべきことは、配列で取ることができるということです。具体的には、の文字列に一致する要素と要素が一致することに興味があります。なぜなら、applyが必要で、直接列を差し込むことができないからです。

今、あなたはacへとbdにこのsim_metricを適用することができます。

df['a_c_comp'] = df.apply(sim_metric, 
          args=('a', 'c'), 
          axis=1) 

df['b_d_comp'] = df.apply(sim_metric, 
          args=('b', 'd'), 
          axis=1) 

は、私は、一般的なsim_metricの列名を指定するapplyargs引数を使用する方法に注意してください。

最後に、comparison_ratio列のmaxを実行できます。

df['comparison_ratio'] = df[['a_c_comp', 'b_d_comp']].max(axis=1) 
print(df) 

結果は次のとおりです。

 a  b  c  d a_c_comp b_d_comp comparison_ratio 
0 apple paster noodle paster 0.363636 1.000000   1.000000 
1 bac  bur  are  bun 0.333333 0.666667   0.666667 
2 sit sign  and lake 0.000000 0.000000   0.000000 
3 car  bun  ape  bun 0.333333 1.000000   1.000000 
4 alli makeup noodle paster 0.200000 0.333333   0.333333 
+0

これは、データフレーム列の間の単純なチェックのようです。列cと列dのすべての項目に対してインデックス1の列を確認し、最大一致率を見つけ、cとdの最大一致率の値をその行に連結する必要があります。だから、結果dfが結果dfで変わったのはなぜでしょうか? –

+1

@AranFreelああ、大丈夫...すべての比較はまだ完全には分かっていません。例として、 'df1'から' apple'と 'paster'を取り出して、あなたが欲しいペアワイズ比較を教えてください。 –

+0

DF1のbがパスター、DF2のdがパスタであるため、パスタとリンゴの付いたDF1は、DF2の中でヌードルパスタを持つ列と一致します。インデックス0の列aとb(リンゴとペースト)の両方の値は、列cとdのすべての値と比較されます。アップルは列cと列dの各値と比較します。パスタも同じことをするでしょう。すべての値を比較した後、DF2の行から最大比率の一致が得られ、比較が行われたDF1に連結されます(リンゴとペースト) –