2017-02-27 11 views
0

나는 df1과 df2를 가지고있다.을 사용하여 df1의 열 A와 df2의 A 열을 일치시키고 특정 비율 일치에 따라 df2의 B 열에 ID를 반환합니다.Python에서 FuzzyWuzzy를 사용하여 두 데이터 프레임 간의 이름을 일치시키는 방법?

예를 들어 :

DF1은 다음과 같습니다


이름

샐리 조개를 판매


DF2은 다음과 같습니다


이름 | ID

Sally slls sshells | 내가 할 노력하고있어 28,904


는 DF2에서 열 A에 일치하는 항목을 찾아 DF2의 열 B에서 ID를 반환하는 DF1의 열 A의 모든 것을 비교입니다.

퍼지 비율의 기준을 설정할 수 있기를 바랍니다. 예를 들면 : 나는 단지 비율이 50

위 내 현재 코드의 경우에 ID를 반환 할 :

import pandas as pd 
import numpy as np 
from fuzzywuzzy import fuzz 
from fuzzywuzzy import process 
df1=pd.read_csv('C:\\Users\\nkurdob\\Desktop\\Sheet1.csv') 
df2=pd.read_csv('C:\\Users\\nkurdob\\Desktop\\Sheet2.csv') 


for i in range(len(df1)): 
    em = df1['A'][i] 
    test = fuzz.partial_ratio(em, df2['A']) 
    if test > 50: 
     print df1['A'][i]==df2['B'] 

답변

0

우선 감사는 질문에 대해, 내가 fuzzywuzzy 이전에 사용한 적이 ...

귀하의 질문에 대한 답변입니다.

여기서 이름은 열과 2 데이터 프레임으로 일치시키고 50 점을 초과하는 결과 만 표시합니다.

이러한 결과를 연결 (또는 열 바꾸기) 할 때 일치하는 항목이없는 곳에 공백 값을 추가합니다. 분명히이 작업을 수행 할 수도 있고하지 않을 수도 있습니다.

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

d1={1:'Tim','2':'Ted',3:'Sally',4:'Dick',5:'Ethel'} 
d2={1:'Tam','2':'Tid',3:'Sally',4:'Dicky',5:'Aardvark'} 

df1=pd.DataFrame.from_dict(d1,orient='index') 
df2=pd.DataFrame.from_dict(d2,orient='index') 

df1.columns=['Name'] 
df2.columns=['Name'] 

def match(Col1,Col2): 
    overall=[] 
    for n in Col1: 
     result=[(fuzz.partial_ratio(n, n2),n2) 
       for n2 in Col2 if fuzz.partial_ratio(n, n2)>50 
       ] 
     if len(result): 
      result.sort()  
      print('result {}'.format(result)) 
      print("Best M={}".format(result[-1][1])) 
      overall.append(result[-1][1]) 
     else: 
      overall.append(" ") 
    return overall 

print(match(df1.Name,df2.Name)) 

이렇게하면 출력이 이와 같이 나타납니다.

result [(67, 'Tam'), (67, 'Tid')] 
Best M=Tid 
result [(67, 'Tid')] 
Best M=Tid 
result [(100, 'Sally')] 
Best M=Sally 
result [(100, 'Dicky')] 
Best M=Dicky 
['Tid', 'Tid', 'Sally', 'Dicky', ' '] 

분명히 중간 결과 만 표시하므로 값 일치 절이 작동하고 있음을 보여줄 수 있습니다.

그런 다음 튜플 목록을 정렬하고 (점수 값 저장 순서대로 저장 됨) 마지막 항목을 가져옵니다 (정렬을 취소하고 가장 큰 값을 취할 수 있음). 그런 다음 두 번째 항목을 가져옵니다. 요소 ([1])를 튜플로부터 삭제합니다.

두 개의 문자열 열 모두에서 작동해야하지만 테스트하지는 않았습니다.