模糊匹配列表与数据框中的列
Fuzzy Match List with Column in a data frame
我有一个字符串列表,我试图将它们与列中的值匹配。如果它是低匹配(低于 95),我想 return 当前列值,如果它高于 95,那么我想 return 列表中的最佳模糊匹配。我正在尝试将所有 returned 值放入一个新列中。我一直收到错误 "tuple index out of range",我想这可能是因为它想要 return 一个包含分数和名称的元组,但我只想要名称。这是我当前的代码:
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
几处更正。
改变
df['NEW_PETS'] = 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
只被调用一次,它的 return 值将被广播到系列的所有条目中 df['NEW_PETS']
.
一种更 pandas 友好的方式:
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)
我有一个字符串列表,我试图将它们与列中的值匹配。如果它是低匹配(低于 95),我想 return 当前列值,如果它高于 95,那么我想 return 列表中的最佳模糊匹配。我正在尝试将所有 returned 值放入一个新列中。我一直收到错误 "tuple index out of range",我想这可能是因为它想要 return 一个包含分数和名称的元组,但我只想要名称。这是我当前的代码:
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
几处更正。
改变
df['NEW_PETS'] = 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
只被调用一次,它的 return 值将被广播到系列的所有条目中df['NEW_PETS']
.
一种更 pandas 友好的方式:
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)