パンダのあいまい一致

Salman Mehmood 2024年2月15日
パンダのあいまい一致

この記事では、データ フレームをマージする方法と、あいまい一致を適用して Python で 2つのパンダのデータ フレームを比較する方法を説明します。

Python で Pandas データ フレームにファジー マッチを適用する

2つの異なるテーブルを使用する次のユース ケースがあり、それらを共通の列にマージするとします。 例を見てください。

最初のデータ フレームである df1 と 2 番目のデータ フレームである df2 があり、どちらにも Company_Name という列が含まれています。 たとえば、次のコード ブロックを参照してください。

import pandas as pd

df1 = [
    "Amazing Art Inc.",
    "Amazing Ants Ltd.",
    "Beautiful Buildings Inc.",
    "Clean Communication Inc.",
    "Dramatic Dramas Ltd.",
]
df2 = [
    "Amazing art gnc.",
    "Amazing Aant Ltd.",
    "Beautiful Buildings Inc",
    "Clear Communication Inc.",
    "Pramatic Dramas Inc.",
]

df1 = pd.DataFrame(df1, columns=["Company_Name"])
df2 = pd.DataFrame(reversed(df2), columns=["Company_Name"])

それらを比較すると、かなり似た名前であることがわかりますが、Amazing Art Inc.があり、別のデータ フレームにAmazing Art gnc.があるなど、正確には同一ではありません。 その他の項目には若干の変更が加えられています。

実際のデータを扱う場合、これらの項目を一致させることはできません。 幸いなことに、fuzzywuzzy ライブラリを使用した解決策があります。 Jupyter ノートブックを使用しているため、このライブラリを Jupyter にインストールする方法を説明します。

sys ライブラリをインポートし、波括弧内の executable を使用します。この前にコマンドを記述します。

import sys
!{sys.executable} -m pip install fuzzywuzzy

出力:

Collecting fuzzywuzzy
  Downloading fuzzywuzzy-0.18.0-py2.py3-none-any.whl (18 kB)
Installing collected packages: fuzzywuzzy
Successfully installed fuzzywuzzy-0.18.0

インストールが成功したら、fuzzywuzzy ライブラリから必要な関数とモジュールをロードします。

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

次に、process から extractOne() 関数を使用して、それがどのように機能するかを示します。見つかった最も可能性の高い一致のみを返します。 たとえば、Beautiful Bldgfs を照合し、列名を使用して df1 と比較します。

process.extractOne("Beautiful Bldgfs", df1["Company_Name"])

ご覧のとおり、Beautiful Buildings Inc. が返され、77 はこれが正しい一致であるという推定または信頼度です。 最後の数値の 2 は、データ フレーム内の位置を示します。

('Beautiful Buildings Inc.', 77, 2)

すべての列のデータ フレーム全体を比較するには、新しい列を作成し、df1 から Company_Name 列を読み込み、map() 関数を使用してマッピングします。 lambda 関数を使用して extractOne() を呼び出します。

この関数内に df2 を配置し、列をチェックして最も近い一致を見つけます。その後、タプルを返すためインデックスを使用でき、タプルの最初のエントリのみを返したいとします。

df1 を呼び出すと、すべてのエントリに最も近い一致が得られたことがわかります。

df1["Best_Match"] = df1["Company_Name"].map(
    lambda x: process.extractOne(x, df2["Company_Name"])[0]
)
df1

出力:

パンダのあいまい一致 - 出力

上記の例の完全な Python コードを次に示します。

from fuzzywuzzy import fuzz
from fuzzywuzzy import process
import pandas as pd


df1 = [
    "Amazing Art Inc.",
    "Amazing Ants Ltd.",
    "Beautiful Buildings Inc.",
    "Clean Communication Inc.",
    "Dramatic Dramas Ltd.",
]
df2 = [
    "Amazing art gnc.",
    "Amazing Aant Ltd.",
    "Beautiful Buildings Inc",
    "Clear Communication Inc.",
    "Pramatic Dramas Inc.",
]


df1 = pd.DataFrame(df1, columns=["Company_Name"])
df2 = pd.DataFrame(reversed(df2), columns=["Company_Name"])

print(process.extractOne("Beautiful Bldgfs", df1["Company_Name"]))

df1["Best_Match"] = df1["Company_Name"].map(
    lambda x: process.extractOne(x, df2["Company_Name"])[0]
)
print(df1)
著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn