2017-02-23 2 views
1

현재 퍼지 논리가 결합되어야하는 데이터 집합이 있습니다. 데이터 프레임 df1은 약 10 회의 관측치가있는 더 작은 참조 테이블입니다. Dataframe df2는 퍼지 논리 조인 (fuzzy logic join)을 수행해야하는 약 2000 건의 관측이있는 주요 데이터 프레임입니다. 나는 아래의 예와 나의 시도를 제시한다.Python pandas 퍼지 논리

import difflib 
df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']}) 
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']}) 

# my approach 
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0]) 

나는 다음과 같은 오류가 발생합니다 : 당신이 얻을

List out of range

답변

1

: 목록 범위

TypeError: 'float' object is not utterable

에서 뭔가 다른과 np.nan를 교체 할 경우, 나는 또 다른 오류 TypeError 데이터 프레임 df2에 나노 값이 있기 때문에 삭제해야합니다.

다른 문제 : df1에 'six'에 대한 규칙이없고 df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])[0])은 목록 중 하나가 비어있어 오류 List out of range을 생성합니다.

코드는 다음과 같습니다 (또는 '6'에 대한 규칙을 df1에 추가하면 your_approach를 사용할 수 있습니다).

import pandas as pd 
import numpy as np 
import difflib 

df1 = pd.DataFrame({'number':[1,2,3,4,5],'not_shifted':['one','two','three','four','five']}) 
df2 = pd.DataFrame({'values':[['test'],['a'],['b'],['c'],['d'],['e'],['f'],['f'],['f']],'not_shifted':[np.nan,'one','too','three','fours','five','six',np.nan,'one']}) 

# Drop nan value 
df2=df2.dropna() 

# You cat write [0] because df1 does not have 'six' 
df2['not_shifted'] = df2['not_shifted'].map(lambda x: difflib.get_close_matches(x, df1['not_shifted'])) 
print df2 

출력 :

not_shifted values 
1  [one] [a] 
2  [two] [b] 
3  [three] [c] 
4  [four] [d] 
5  [five] [e] 
6   [] [f] 
8  [one] [f] 
+0

안녕하세요 세레, 내가 dataframe에 대괄호를 제거하려면 어떻게해야 빠른 응답 및 솔루션 : – Seb

+0

안녕하세요 세레, 주셔서 감사합니다. 대답은 정확하지만 솔루션의 대괄호는 약간의 혼란을 야기합니다. 이 데이터 프레임에서 목록을 정의하는 목적은 무엇입니까? 감사. – Seb