我有一个字符串列表,我试图匹配列中的值。如果它是低匹配(低于95)我想返回当前列值,如果它高于95,那么我想从列表中返回最佳模糊匹配。我试图将所有返回的值放入一个新列。我一直得到错误“元组索引超出范围”,我想这可能是因为它想要返回一个带有分数和名称的元组,但我只想要这个名字。这是我目前的代码:
from fuzzywuzzy import process
from fuzzywuzzy import fuzz
L = [ducks, frogs, doggies]
df
FOO PETS
a duckz
b frags
c doggies
def fuzz_m(column, pet_list, score_t):
for c in column:
new_name, score = process.extractOne(c, pet_list, score_t)
if score<95:
return c
else:
return new_name
df['NEW_PETS'] = fuzz_m(df,L, fuzz.ratio)
期望的输出:
FOO PETS NEW_PETS
a duckz ducks
b frags frogs
c doggies doggies
答案 0 :(得分:1)
多次更正。
更改
df [&#39; NEW_PETS&#39;] = fuzz_m(df,L,fuzz.ratio)
到
df['NEW_PETS'] = fuzz_m(df['PETS'], L, fuzz.ratio)
制作列表元素字符串。
Fuzzywuzzy的extractOne
方法按顺序接受处理器和记分器(link to source code。)。 fuzz.ratio
的位置论证被错误地解释为处理器,当它真的是一个得分手时。将process.extractOne(c, pet_list, score_t)
更改为process.extractOne(c, pet_list, scorer=score_t)
。
此基于循环的代码无法按预期工作。 fuzz_m
仅被调用一次,其返回值将广播到系列df['NEW_PETS']
的所有条目中。
更适合熊猫的方式:
L = ['ducks', 'frogs', 'doggies']
def fuzz_m(col, pet_list, score_t):
new_name, score = process.extractOne(col, pet_list, scorer=score_t)
if score<95:
return col
else:
return new_name
df['NEW_PETS'] = df['PETS'].apply(fuzz_m, pet_list=L, score_t=fuzz.ratio)