如何使用FuzzyWuzzy对比单列与多列查找缺失的匹配词汇
实现方案
1. 核心逻辑说明
- 先收集所有对照列的非空合法值,构建全局查找集合,提升查询效率
- 拆分
item_composition列的每一行组分,按;切割并去除每个组分前后空格 - 过滤出不在对照集合中的组分,拼接后即为该行的输出结果
2. 完全匹配版本代码
你可以在现有代码基础上新增以下内容实现需求:
# ---------------------- 以下是新增实现代码 ---------------------- # 1. 构建对照词汇集合:替换下方列表为你实际需要校验的对照列名,比如示例中的['A','B']或者你业务中的匹配结果列 check_cols = ['A', 'B'] valid_words = set() for col in check_cols: # 排除空值、None以及'None'字符串,去重后加入集合 not_null_vals = ramen[col].dropna().astype(str).str.strip() valid_words.update([v for v in not_null_vals if v not in ['', 'None']]) # 2. 定义单行处理函数 def get_not_exist_composition(composition_str): if pd.isna(composition_str) or composition_str.strip() == '': return '' # 拆分组分并清除每个组分前后空格 composition_list = [x.strip() for x in composition_str.split(';')] # 过滤出不在对照集合里的组分 not_exist_list = [x for x in composition_list if x not in valid_words] # 按要求格式拼接返回 return ' ; '.join(not_exist_list) # 3. 应用函数得到结果列 ramen['not_exist_composition'] = ramen['item_composition'].apply(get_not_exist_composition) # 查看输出结果 print(ramen[['item_composition', 'not_exist_composition']])
3. 可选:模糊匹配版本(容忍拼写误差)
如果需要支持拼写相近就算命中的场景,可以结合你已导入的fuzzywuzzy库实现,设置相似度阈值即可:
# 相似度阈值,可根据业务需求调整,分值范围0-100 SIMILAR_THRESHOLD = 85 valid_words_list = list(valid_words) def fuzzy_get_not_exist(composition_str): if pd.isna(composition_str) or composition_str.strip() == '': return '' composition_list = [x.strip() for x in composition_str.split(';')] not_exist_list = [] for word in composition_list: # 查找最匹配的词汇,返回(匹配值, 得分) match_res = process.extractOne(word, valid_words_list, scorer=fuzz.WRatio) if not match_res or match_res[1] < SIMILAR_THRESHOLD: not_exist_list.append(word) return ' ; '.join(not_exist_list) # 应用模糊匹配函数 ramen['not_exist_composition_fuzzy'] = ramen['item_composition'].apply(fuzzy_get_not_exist)
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

