【发布时间】:2021-09-06 18:08:12
【问题描述】:
我有 2 个数据框 df1 和 df2,如下所示:
df1:
Id Name
1 Tuy Hòa
2 Kiến thụy
3 Bình Tân
df2:
code name
A1 Tuy Hoà
A2 Kiến Thụy
A3 Tân Bình
现在当我使用合并时:
out_df = pd.merge(df1, df2, left_on=['Name'], right_on=['name'], how='outer')
当然结果为空,因为Tuy Hòa Tuy Hoà 的例子(问题是位置符号“`”),...
然后我使用模糊函数并应用 lambda 但它根本不正确:(
我的功能:
def checker(Name,names):
correct_name = ''
correct_ratio = 0
if Name in names:
ratio = 100
else:
try:
x = process.extractOne(Name, names, scorer=fuzz.token_set_ratio, score_cutoff = 80)
correct_name = x[0]
#correct_ratio = x[1]
except:
correct_name = ''
#correct_ratio = 0
return correct_name
然后我转换:
names = df2['name'].tolist()
之后我使用apply循环,比较并输出正确(df1必须基于df2才能正确)
df1['Name'] = df1['Name'].apply(lambda x: checker(x,names) if not checker(x,names) else x)
现在的输出是:
df1
Id Name
1 Tuy Hòa
2 Kiến Thụy
3 Tân Bình
似乎Tuy Hòa 和Kiến Thụy 是正确的,但Bình Tân 和Tân Bình 是不同的名称!所以在这种情况下改变位置字符是正确的,而不是输入错误:(期望输出应该是:
df1
Id Name
1 Tuy Hòa
2 Kiến Thụy
3 Bình Tân
我尝试将fuzz.ratio 与score_cutoff = 55 一起使用,但在某些情况下会错过配对
任何解决方案都比我的解决方案更好? (也许不使用模糊库?)请帮助我。非常感谢您的帮助
【问题讨论】:
-
您为fuzzywuzzy(标记集)选择的记分器将字符串作为(顾名思义)标记集进行比较。集合没有内部排序,因此该记分器将返回“Foo Bar”作为“Bar Foo”的完全匹配。
标签: python pandas lambda apply fuzzywuzzy