如何对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
相关产品推荐
相关产品推荐

