You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 06:12:10