2016-04-11 83 views
0

爲什麼difflib.get_close_matches在以下示例中找不到匹配項時會拋出「列表索引超出範圍」錯誤?Python熊貓difflib拋出; 「列表索引超出範圍」錯誤

from pandas import DataFrame 
import difflib 

df1 = DataFrame([[1,'034567','Foo'], 
       [2,'1cd2346','Bar']], 
       columns=['ID','Unit','Name']) 
df2 = DataFrame([['SellTEST','0ab1234567'], 
       ['superVAR','1ab2345']], 
       columns=['Seller', 'Unit']) 

df2['Unit'] = df2['Unit'].apply(lambda x: difflib.get_close_matches(x, df1['Unit'])[0]) 

df1.merge(df2) 

我得到在DF1值是遙遠 - 但我不希望這個誤差喜歡它,我希望它根本不匹配。

+0

我認爲你正在回答你自己的問題...... difflib沒有返回任何關閉匹配,這是一個空列表。然後你盲目地尊重它,假設有一場比賽,而沒有。你的lambda,而不是簡單地引用'[0]',需要首先檢查一個長度。你想在那裏沒有比賽呢? –

回答

0

get_close_matches根本無法比擬的 - 由difflib.get_close_matches返回的列表是空的,然後試着訪問它的第一個元素,它拋出IndexError

如果你想更換那裏有與None沒有匹配的元素,你可以使用此代碼代替,它利用一個事實,即空列表是falsey與None替換falsey值:

df2['Unit'] = df2['Unit'].apply(lambda x: (difflib.get_close_matches(x, df1['Unit'])[:1] or [None])[0])