如何用for循环遍历列表实现模糊匹配并写入匹配分数至数据集?
问题分析与解决
先看你代码里的几个问题:
- 函数内调用
fuzz.ratio(x, keys)是错误的,应该和遍历的单个key比较,不是整个keys列表 - 循环里每次覆盖变量
a,最后只会保留最后一个key的匹配分,没取所有key里的最高分数 - 函数没有返回计算结果,等于白算
apply传参用了word=,但函数定义的参数是keys,参数名不匹配,导致传参失败
修正后的代码实现
首先确保你已经安装了fuzzywuzzy(可选安装python-Levenshtein提升匹配速度):
pip install fuzzywuzzy python-Levenshtein
方案1:使用for循环实现(符合你要求的遍历方式)
from fuzzywuzzy import fuzz import pandas as pd def get_max_fuzz_score(x, keys): max_score = 0 # 遍历每个key,计算匹配分数并记录最大值 for key in keys: current_score = fuzz.ratio(x, key) if current_score > max_score: max_score = current_score return max_score # 示例数据集 dataset = pd.DataFrame({'col1': ['banana', 'appl', 'oranges', 'ba']}) # 调用apply时传入正确的参数名 dataset['match'] = dataset['col1'].apply(get_max_fuzz_score, keys=['apple', 'orange', 'banana']) print(dataset)
方案2:更简洁的写法(用生成器表达式+max函数)
如果不想写显式for循环,可以用一行代码实现核心逻辑:
def get_max_fuzz_score(x, keys): return max(fuzz.ratio(x, key) for key in keys)
运行后输出和你预期的一致:
col1 match 0 banana 100 1 appl 80 2 oranges 90 3 ba 20
额外说明
如果需要保留每个key对应的匹配分数(而不是只取最大值),可以让函数返回字典,再扩展成多列:
def get_all_fuzz_scores(x, keys): return {key: fuzz.ratio(x, key) for key in keys} score_df = dataset['col1'].apply(get_all_fuzz_scores).apply(pd.Series) dataset = pd.concat([dataset, score_df], axis=1)
这样输出会包含apple、orange、banana三个列,分别对应各自的匹配分数。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

