2016-06-24 4 views
1

私は2つのデータフレームを持っています。 1つに33765社が含まれています。もう1つは358839社です。私はファジーマッチを使って2つのマッチングを見つけたい。レコード数が多すぎるため、会社名の1文字目に基づいて両方のデータフレームのレコードを細分化しようとしています。 例:文字「A」で始まるすべての企業では、1番目のデータフレームには2600レコード、2番目には25000レコードがあります。私はそれらの間で完全なマージを実装して、ファジー値を持つすべての企業に95を超えるファジーマッチを適用しています。 レコードの数がそれでも完全にマージしてからファジーを実装するには高すぎるため、これはまだ機能しません。これらの操作を行うたびにカーネルが死ぬ。両方のフレームのレコード数が4桁の場合、同じアプローチがうまくいきました。 また、各文字のコードを手動で実行するのではなく(カーネルの死ぬことなく)、すべての文字 'A'〜 'Z'を自動化する方法があるかどうかをお勧めします。多数のレコード間のファジーマッチ

c='A' 
df1 = df1[df1.companyName.str[0] == c ].copy() 
df2 = df2[df2.companyName.str[0] == c].copy() 
df1['Join'] =1 
df2['Join'] =1 
df3 = pd.merge(df1,df2, left_on='Join',right_on='Join') 
df3['Fuzz'] = df3.apply(lambda x: fuzz.ratio(x['companyName_x'], x['companyName_y']) , axis=1) 
df3.sort_values(['companyName_x','Fuzz'],ascending=False, inplace=True) 
df4 = df3.groupby('companyName_x',as_index=False).first() 
df5=df4[df4.Fuzz>=95] 
+0

カーネルはなぜ死ぬのですか?どのくらいのRAMがありますか、RAMが不足していますか?あなたの質問に 'df1.info(verbose = True、memory_usage = True)と' df1.info(verbose = True、memory_usage = True)の出力を含めることができますか? – Kartik

+0

理由はわかりませんが、これは出力を表示しません。 – ComplexData

答えて

0

は、あなたが共有帰属(最初の文字)に基づいてレコードをチャンキングにより、正しい道を下って行く開始しました:

は、ここに私のコードです。レコードリンケージの文献では、このコンセプトはblockingと呼ばれており、扱いやすいものへの比較回数を減らすことが重要です。

先進的な方法は、より優れたブロックルールを見つけることです。最初の5文字、または共通の単語です。

dedupe libraryは、良好なブロックルールを見つけるのに役立ちます。 (私はこのライブラリの中心的な開発者です)

関連する問題