2016-07-25 5 views
5

각기 다른 수의 행을 가진 두 개의 데이터 프레임이 있습니다. 다음은 각 데이터에서 몇 행이데이터 프레임 열에 퍼지 일치를 적용하고 결과를 새 열에 저장합니다.

df1 = 
    Company         City   State ZIP 
    FREDDIE LEES AMERICAN GOURMET SAUCE  St. Louis MO  63101 
    CITYARCHRIVER 2015 FOUNDATION    St. Louis MO  63102 
    GLAXOSMITHKLINE CONSUMER HEALTHCARE  St. Louis MO  63102 
    LACKEY SHEET METAL      St. Louis MO  63102 

df2 = 
    FDA Company     FDA City FDA State FDA ZIP 
    LACKEY SHEET METAL    St. Louis MO   63102 
    PRIMUS STERILIZER COMPANY LLC Great Bend KS   67530 
    HELGET GAS PRODUCTS INC  Omaha  NE   68127 
    ORTHOQUEST LLC     La Vista NE   68128 

을 설정이다 나는 combined_data = pandas.concat([df1, df2], axis = 1)를 사용, 나란히 합류했다. 다음 목표는 df1['Company'] 아래의 각 문자열을 df2['FDA Company']에있는 각 문자열과 fuzzy wuzzy 모듈의 여러 가지 일치하는 명령을 사용하여 비교하고 가장 일치하는 값과 해당 이름을 반환하는 것입니다. 나는 그것을 새로운 칼럼에 저장하고 싶다. 예를 들어 내가 df2['FDA Company']df1['Company']LACKY SHEET METALfuzz.ratiofuzz.token_sort_ratio를 한 경우가 가장 일치가 100의 점수 LACKY SHEET METAL이었고, 이것은 다음 combined data에 새 열 아래에 저장 될 수 있음을 반환합니다. 그 결과 내가

combined_data['name_ratio'] = combined_data.apply(lambda x: fuzz.ratio(x['Company'], x['FDA Company']), axis = 1) 

을하고 시도
combined_data = 
    Company         City   State ZIP  FDA Company      FDA City FDA State FDA ZIP  fuzzy.token_sort_ratio match fuzzy.ratio   match 
    FREDDIE LEES AMERICAN GOURMET SAUCE  St. Louis MO  63101 LACKEY SHEET METAL    St. Louis MO   63102  LACKEY SHEET METAL  100  LACKEY SHEET METAL 100 
    CITYARCHRIVER 2015 FOUNDATION    St. Louis MO  63102 PRIMUS STERILIZER COMPANY LLC Great Bend KS   67530 
    GLAXOSMITHKLINE CONSUMER HEALTHCARE  St. Louis MO  63102 HELGET GAS PRODUCTS INC   Omaha  NE   68127 
    LACKEY SHEET METAL      St. Louis MO  63102 ORTHOQUEST LLC     La Vista NE   68128 

같이 그러나 컬럼의 길이가 다르기 때문에 오류를 가지고있다.

나는 혼란 스럽습니다. 내가 어떻게이 일을 할 수 있니?

답변

7

내가 무엇을하고 있었는지 말할 수 없었습니다. 이것이 내가하는 방법이다.

from fuzzywuzzy import fuzz 
from fuzzywuzzy import process 

비교하려면 튜플의 시리즈를 만듭니다

compare = pd.MultiIndex.from_product([df1['Company'], 
             df2['FDA Company']]).to_series() 

퍼지 메트릭을 계산하고 시리즈를 반환하는 특수 기능을 만듭니다.

def metrics(tup): 
    return pd.Series([fuzz.ratio(*tup), 
         fuzz.token_sort_ratio(*tup)], 
        ['ratio', 'token']) 

compare 시리즈 metrics 적용

compare.apply(metrics) 

enter image description here

이 다음 부분을 수행하는 방법의 무리가 있습니다

df1

의 각 행에 가장 가까운 요소를 가져옵니다
compare.apply(metrics).unstack().idxmax().unstack(0) 

enter image description here

이 좋은 답변입니다 df2

compare.apply(metrics).unstack(0).idxmax().unstack(0) 

enter image description here

+0

의 각 행에 가까운 경기를 잡아! 그러나 큰 파일 (~ lakhs)의 경우 메모리 오류가 발생합니다. – user1930402

관련 문제