Pandas でファジーマッチングを実行する方法 (例付き)


多くの場合、不完全に一致する文字列に基づいて 2 つのデータセットを pandas で結合したい場合があります。これはファジーマッチングと呼ばれます。

pandas であいまい一致を実行する最も簡単な方法は、 difflibパッケージのget_close_matches()関数を使用することです。

次の例は、この関数を実際に使用する方法を示しています。

例: pandas におけるファジー対応

さまざまなバスケットボール チームに関する情報を含む、次の 2 つのパンダ データフレームがあるとします。

 import pandas as pd

#create two DataFrames
df1 = pd. DataFrame ({' team ': ['Mavericks', 'Nets', 'Warriors', 'Heat', 'Lakers'],
                    ' points ': [99, 90, 104, 117, 100]})

df2 = pd. DataFrame ({' team ': ['Mavricks', 'Warrors', 'Heat', 'Netts', 'Lakes'],
                    ' assists ': [22, 29, 17, 40, 32]})

#view DataFrames
print (df1)

        team points
0 Mavericks 99
1 Nets 90
2 Warriors 104
3 Heat 117
4 Lakers 100

print (df2)

       team assists
0 Mavricks 22
1 Warriors 29
2 Heat 17
3 Netts 40
4 Lakes 32

次に、 Team列に基づいて 2 つの DataFrame をマージするとします。

2 つのデータフレーム間でチーム名がわずかに異なるため、ファジー マッチングを使用して、最も一致するチーム名を見つける必要があります。

これを行うには、 difflibパッケージのget_close_matches()関数を使用できます。

 import difflib 

#create duplicate column to retain team name from df2
df2[' team_match '] = df2[' team ']

#convert team name in df2 to team name it most closely matches in df1
df2[' team '] = df2[' team ']. apply (lambda x: difflib. get_close_matches (x, df1[' team '])[ 0 ])

#merge the DataFrames into one
df3 = df1. merge (df2)

#view final DataFrame
print (df3)

        team points assists team_match
0 Mavericks 99 22 Mavricks
1 Nets 90 40 Nets
2 Warriors 104 29 Warriors
3 Heat 117 17 Heat
4 Lakers 100 32 Lakes

結果は、最初のデータフレームの 5 つのチーム名それぞれと、2 番目のデータフレームに最もよく一致するチームを含むデータ フレームになります。

「team_match」列には、最初のデータフレームのチーム名に最もよく一致する 2 番目のデータフレームのチーム名が表示されます。

注 #1 : デフォルトでは、 get_close_matches() は最も近い 3 つの一致を返します。ただし、ラムダ関数の最後に[0]を使用すると、最も近いチーム名一致のみを返すことができました。

注 #2: get_close_matches()関数の完全なドキュメントは、ここで見つけることができます。

追加リソース

次のチュートリアルでは、パンダで他の一般的なタスクを実行する方法を説明します。

複数の列にまたがる Pandas DataFrame をマージする方法
インデックス上の 2 つの Pandas DataFrame をマージする方法
パンダの結合またはマージ: 違いは何ですか?

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です