パンダのあいまい一致
この記事では、データ フレームをマージする方法と、あいまい一致を適用して 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)
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