Pandas에서 퍼지 일치를 수행하는 방법(예제 포함)


불완전하게 일치하는 문자열을 기반으로 팬더에서 두 개의 데이터 세트를 함께 결합하려는 경우가 종종 있습니다. 이를 퍼지 매칭 이라고 합니다.

pandas에서 퍼지 일치를 수행하는 가장 쉬운 방법은 difflib 패키지의 get_close_matches() 함수를 사용하는 것입니다.

다음 예에서는 이 기능을 실제로 사용하는 방법을 보여줍니다.

예: 팬더의 퍼지 대응

다양한 농구팀에 대한 정보가 포함된 다음 두 개의 팬더 DataFrame이 있다고 가정해 보겠습니다.

 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 열을 기반으로 두 개의 DataFrame을 병합한다고 가정해 보겠습니다.

두 DataFrame의 팀 이름이 약간 다르기 때문에 가장 일치하는 팀 이름을 찾으려면 퍼지 매칭을 사용해야 합니다.

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

결과는 첫 번째 DataFrame의 5개 팀 이름 각각과 두 번째 DataFrame과 가장 밀접하게 일치하는 팀을 포함하는 데이터 프레임입니다.

team_match 열에는 첫 번째 DataFrame의 팀 이름과 가장 근접하게 일치하는 두 번째 DataFrame의 팀 이름이 표시됩니다.

참고 #1 : 기본적으로 get_close_matches()는 가장 가까운 일치 항목 3개를 반환합니다. 그러나 람다 함수 끝에 [0]을 사용하면 가장 가까운 팀 이름 일치만 반환할 수 있었습니다.

참고 #2: get_close_matches() 함수에 대한 전체 문서는 여기에서 찾을 수 있습니다.

추가 리소스

다음 튜토리얼에서는 Pandas에서 다른 일반적인 작업을 수행하는 방법을 설명합니다.

여러 열에 걸쳐 Pandas DataFrame을 병합하는 방법
인덱스에 두 개의 Pandas DataFrame을 병합하는 방법
Pandas 조인 또는 병합: 차이점은 무엇인가요?

의견을 추가하다

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다