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

如何对Pandas DataFrame列自比对,用FuzzyWuzzy合并相似行求和?

看起来你需要解决的是基于字符串相似度合并DataFrame行并求和的问题,还碰到了KeyError的困扰,我来一步步帮你搞定!

问题分析

你的核心需求是:用FuzzyWuzzy检测A列中相似度高的字符串,把它们归为一组,然后对每组的B列值求和。KeyError通常是因为操作DataFrame列时引用错误,或者分组/赋值逻辑有问题,我们会在解决过程中避开这个坑。

完整解决方案

1. 导入依赖库

首先确保你已经安装了pandas和fuzzywuzzy(如果速度要求高,也可以用更快的rapidfuzz替代):

import pandas as pd
from fuzzywuzzy import fuzz, process

2. 准备示例数据

先还原你的测试数据:

data = {
    'a': ['apple', 'orang', 'aple', 'orange', 'banana'],
    'b': [3, 4, 1, 10, 5]
}
df = pd.DataFrame(data)

3. 核心:给相似字符串分组

我们需要给每个字符串分配一个"组标识"(比如组内第一个出现的字符串),后续用这个标识分组求和:

# 设置相似度阈值(可根据实际数据调整,比如80分以上算相似)
similarity_threshold = 80

groups = []
existing_groups = []

for name in df['a']:
    # 在已有的组名中找最相似的匹配项
    best_match = process.extractOne(name, existing_groups, scorer=fuzz.token_sort_ratio)
    # 如果匹配得分超过阈值,就用已有组名;否则新建组
    if best_match and best_match[1] >= similarity_threshold:
        groups.append(best_match[0])
    else:
        groups.append(name)
        existing_groups.append(name)

# 把分组列加入原DataFrame
df['group_id'] = groups

4. 分组求和得到最终结果

现在可以按group_id分组,对B列求和,再整理成你想要的格式:

# 分组求和并重置索引
result_df = df.groupby('group_id')['b'].sum().reset_index()
# 重命名列,匹配你的期望输出
result_df.columns = ['a', 'b']

print(result_df)

运行后会得到你想要的结果:

a   b
0   apple   4
1  banana   5
2   orang  14

关于你遇到的KeyError

你提到执行df['b']=df.a...时出现KeyError,大概率是这几个原因:

  • 列名拼写错误:比如误写了'a'或'b'的列名
  • 直接修改原列时,操作返回的不是符合要求的Series(比如分组后结构不匹配)
  • 操作过程中意外修改了DataFrame的结构,导致列被删除或索引混乱

上面的方案通过新增分组列、生成新DataFrame的方式,避开了直接修改原列可能带来的问题,自然也就不会触发KeyError了。

额外优化建议

  • 如果你的数据量很大,fuzzywuzzy速度可能较慢,可以换成rapidfuzz(API和FuzzyWuzzy几乎一致,但性能提升明显)
  • 阈值可以根据实际数据调整:比如对拼写错误容忍度高就调低阈值,要求严格就调高
  • 如果需要保留组内的"标准名称"(比如优先保留正确的apple而不是aple),可以在分组时优先选择更规范的字符串作为组标识

内容的提问来源于stack exchange,提问作者phltop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:29:03