5

50,000 の一意の行と 20 の列を持つ次の pandas データフレームがあります (関連する列のスニペットが含まれています)。

df1 :

            PRODUCT_ID           PRODUCT_DESCRIPTION
0           165985858958         "Fish Burger with Lettuce"
1           185965653252         "Chicken Salad with Dressing"
2           165958565556         "Pork and Honey Rissoles"
3           655262522233         "Cheese, Ham and Tomato Sandwich"
4           857485966653         "Coleslaw with Yoghurt Dressing"
5           524156285551         "Lemon and Raspberry Cheesecake"

また、2 つの列と 20,000 の一意の行を持つ次のデータフレーム (これも辞書形式で保存しました) があります。

df2 (dict_2 としても保存)

       PROD_ID   PROD_DESCRIPTION
0      548576    "Fish Burger"
1      156956    "Chckn Salad w/Ranch Dressing"
2      257848    "Rissoles - Lamb & Rosemary"
3      298770    "Lemn C-cake"
4      651452    "Potato Salad with Bacon"
5      100256    "Cheese Cake - Lemon Raspberry Coulis"

私がやりたいことは、df1 の「PRODUCT_DESCRIPTION」フィールドを df2 の「PROD_DESCRIPTION」フィールドと比較し、最も近い一致/一致を見つけて、重い持ち上げ部分を支援することです。その後、一致を手動で確認する必要がありますが、はるかに高速です。理想的な結果は次のようになります。たとえば、1 つ以上の部分一致が記録されます。

     PRODUCT_ID      PRODUCT_DESCRIPTION               PROD_ID   PROD_DESCRIPTION
0    165985858958    "Fish Burger with Lettuce"        548576    "Fish Burger"
1    185965653252    "Chicken Salad with Dressing"     156956    "Chckn Salad w/Ranch Dressing"
2    165958565556    "Pork and Honey Rissoles"         257848    "Rissoles - Lamb & Rosemary"     
3    655262522233    "Cheese, Ham and Tomato Sandwich" NaN       NaN
4    857485966653    "Coleslaw with Yoghurt Dressing"  NaN       NaN
5    524156285551    "Lemon and Raspberry Cheesecake"  298770    "Lemn C-cake"
6    524156285551    "Lemon and Raspberry Cheesecake"  100256    "Cheese Cake - Lemon Raspberry Coulis"

完全一致を特定した結合をすでに完了しています。各 df の製品 ID は一意であるため、インデックスを保持することは重要ではありません。結果は、約 1,400 万行の 3 番目のデータフレームに適用されるため、新しいデータフレームに保存することもできます。

私は次の質問と回答を(特に)使用しました:

Python pandas とのファジー マッチ マージを実行することは可能ですか?答えの 1 つで提案されているように、クラゲ モジュールの試行を含む
重複とのファジー マージ マッチ
Python ファジー マッチング fuzzywuzzy
は、配列の列に最適な一致のみを保持します ファジー マッチ項目

また、さまざまなループ/関数/マッピングなどもありますが、スコアが低い最初の「あいまい一致」を取得するか、一致が検出されないかのいずれかで、成功していません。

一致/距離スコア列がここに従って生成されるというアイデアが気に入っています。これにより、手動チェックプロセスを高速化できるからです。

私はPython 2.7、pandasを使用しており、fuzzywuzzyがインストールされています。

4

3 に答える 3

1

両方のデータフレームを反復処理し、3 番目のデータフレームの dict に目的の情報を入力できるはずです。

d = {
    'df1_id': [],
    'df1_prod_desc': [],
    'df2_id': [],
    'df2_prod_desc': [],
    'fuzzywuzzy_sim': []
}
for _, df1_row in df1.iterrows():
    for _, df2_row in df2.iterrows():
        d['df1_id'] = df1_row['PRODUCT_ID']
        ...
df3 = pd.DataFrame.from_dict(d)
于 2017-01-04T02:18:04.533 に答える