news 2026/7/16 8:51:51

影刀RPA 数据去重的七种方法:从简单到复杂的选型

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
影刀RPA 数据去重的七种方法:从简单到复杂的选型

影刀RPA 数据去重的七种方法:从简单到复杂的选型

作者:林焱

什么情况用这个

你从三个平台采集了商品数据,合并后发现有重复。Excel里的订单记录导入了两次,客户名单里有同名同姓不同人、也有同一人多条记录。

数据去重听起来简单——不就drop_duplicates()嘛?实际远不止。不同场景需要不同的去重策略:有时候全字段相同才是重复,有时候只要ID相同就算重复;有时候要保留第一条,有时候要合并两条记录的信息。这篇文章从简单到复杂,把七种去重方法的使用场景和选择逻辑讲清楚。

怎么做

方法一:集合去重(最简单)

适合:单列数据、全字段重复的场景。

# 字符串列表去重names=["张三","李四","张三","王五","李四"]unique_names=list(set(names))print(unique_names)# ['张三', '李四', '王五'](顺序不保证)# 保持原顺序的去重seen=set()unique_ordered=[]fornameinnames:ifnamenotinseen:seen.add(name)unique_ordered.append(name)print(unique_ordered)# ['张三', '李四', '王五']

方法二:字典键去重(按关键字段)

适合:多个字段中只有某个字段决定是否重复(如ID)。

records=[{"id":"001","name":"商品A","price":99},{"id":"002","name":"商品B","price":199},{"id":"001","name":"商品A(新)","price":109},# 同ID,信息更新了]# 按ID去重,保留第一次出现的seen={}forrecordinrecords:key=record["id"][video(video-owL94VaT-1784132827886)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限!)]ifkeynotinseen:seen[key]=record unique_records=list(seen.values())# 如果需要保留最后出现的(更新的数据)forrecordinrecords:seen[record["id"]]=record# 直接覆盖

方法三:多字段组合键去重

适合:需要多个字段组合才能判断重复。

# 按"姓名+手机号"组合去重contacts=[{"name":"张三","phone":"13800138000","email":"a@x.com"},{"name":"张三","phone":"13900139000","email":"b@x.com"},# 同名人不同手机{"name":"张三","phone":"13800138000","email":"c@x.com"},# 重复(同名同手机)]defdedup_by_keys(records,keys):"""按多个字段组合去重"""seen=set()result=[]forrecordinrecords:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/10e4b6436b9549cdb438f8a1836d159b.png#pic_center)# 生成组合键composite_key=tuple(record.get(k,"")forkinkeys)ifcomposite_keynotinseen:seen.add(composite_key)result.append(record)returnresult unique=dedup_by_keys(contacts,["name","phone"])# 结果:张三+138... 和 张三+139... 两条

方法四:模糊匹配去重

适合:文本不完全一样但基本是同一内容的场景。

importdifflibdeffuzzy_dedup(strings,threshold=0.85):"""模糊去重——相似度超过阈值的视为重复"""unique=[]forsinstrings:is_dup=Falseforexistinginunique:similarity=difflib.SequenceMatcher(None,s,existing).ratio()ifsimilarity>=threshold:is_dup=Truebreakifnotis_dup:unique.append(s)returnunique# 示例:公司名稍有不同的记录names=["深圳市腾讯计算机系统有限公司","深圳腾讯计算机系统有限公司",# 少了"市""深圳市腾讯科技公司",# 不同]unique_names=fuzzy_dedup(names,threshold=0.8)print(unique_names)# 前两条会去重

注意:模糊匹配去重计算量大,数据量>1000条时建议先做精确去重缩小范围。

方法五:合并去重(取并集)

适合:两条重复记录互补的信息要合并。

defmerge_duplicates(records,key_field):"""合并重复记录——取所有字段的非空并集"""merged={}forrecordinrecords:key=record[key_field]ifkeynotinmerged:merged[key]=record.copy()else:# 合并非空字段existing=merged[key]forfield,valueinrecord.items():ifvalueandnotexisting.get(field):existing[field]=value# 用新值填充空字段returnlist(merged.values())# 示例records=[{"id":"001","name":"张三","phone":"13800138000","email":""},{"id":"002","name":"李四","phone":"","email":"lisi@qq.com"},{"id":"001","name":"张三","phone":"","email":"zhangsan@qq.com"},]merged=merge_duplicates(records,"id")# 结果:张三的信息现在有完整的phone和email

方法六:时间优先去重

适合:同一ID有多条历史记录,保留最新的。

fromdatetimeimportdatetimedefkeep_latest(records,key_field,time_field):"""按关键字段去重,保留时间最新的"""latest={}forrecordinrecords:key=record[key_field]record_time=record.get(time_field)# 解析时间ifisinstance(record_time,str):try:record_time=datetime.strptime(record_time,"%Y-%m-%d %H:%M:%S")except:record_time=datetime.minifkeynotinlatest:latest[key]=recordelse:existing_time=latest[key].get(time_field)ifisinstance(existing_time,str):try:existing_time=datetime.strptime(existing_time,"%Y-%m-%d %H:%M:%S")except:existing_time=datetime.minifrecord_time>existing_time:latest[key]=recordreturnlist(latest.values())

方法七:权重优先去重

适合:多源数据去重,不同来源的可信度不同。

defkeep_highest_quality(records,key_field,source_weights):""" 按来源权重去重——保留可信度最高的 source_weights: {"官方数据库": 10, "用户提交": 3, "公开采集": 1} """best={}forrecordinrecords:key=record[key_field]source=record.get("source","未知")weight=source_weights.get(source,0)ifkeynotinbest:best[key]=(weight,record)else:existing_weight,_=best[key]ifweight>existing_weight:best[key]=(weight,record)return[recordfor_,recordinbest.values()]

有什么坑

坑一:set去重后顺序乱了

现象:用set()去重后列表顺序和原来不一样了(Python 3.7+的dict保持插入顺序但set不保证)。

解决:保持顺序用dict.fromkeys()

unique_ordered=list(dict.fromkeys(items))

坑二:忽略了None和空字符串的区别

现象None""被判定为不同的key,导致没去掉重复。

解决:生成组合键时统一规范化空值:

temu店群自动化报活动案例

defnormalize_key(value):"""规范化键值——把各种空值统一"""ifvalueisNoneorstr(value).strip()=="":return"_EMPTY_"returnstr(value).strip()

坑三:模糊去重在大数据集上超慢

现象:5000条数据做两两模糊比较,O(n²)复杂度,流程卡死。

解决:先精确去重,再按首字母或拼音分组缩小候选范围。或者用距离算法先聚类。

坑四:去重决策没有记录

现象:去重后不知道删了什么,出了问题没法回溯。

解决:记录去重日志:

defdedup_with_log(records,key_func):"""带去重日志"""seen={}duplicates=[]forrecordinrecords:key=key_func(record)ifkeyinseen:duplicates.append({"kept":seen[key],"removed":record})else:seen[key]=recordprint(f"去重:{len(records)}{len(seen)}条, 移除{len(duplicates)}条重复")returnlist(seen.values()),duplicates

坑五:业务上的"重复"和技术上的"重复"不一致

现象:程序认为商品ID不同就不是重复,但业务上同一个商品在不同平台有不同ID。

解决:这种情况需要建立"商品映射表"——先做技术去重(按字段),再做业务匹配(按规则),两者分开处理。


总结:去重方法的选择顺序——先用集合/dict按关键字段精确去重(最快),再根据业务需求选择保留策略(第一条、最新、合并、权重),最后才考虑模糊匹配(最慢)。大部分场景用方法一、二、三就够了。每做一次去重,把去重原因和数量记到日志里。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 8:51:25

有营养的人【更新】

1.乐百川 - 简书 2.博客_wqq1027_CSDN博客-领域博主?我也是很有营养的 3.MySQL学习 - 随笔分类 - Greyed Wolf - 博客园 (一些MySQL的博客) 4.StanleyBlogs - 博客园 关于MySQL的一些知识 5.Web development tutorials | w3resource 6.首页 | 离别…

作者头像 李华
网站建设 2026/7/16 8:49:12

Mac 用户如何玩转 LeRobot?M3 芯片部署6 轴机械臂SoArm101经验总结 第2篇

关于系列 这个系列会记录我基于 LeRobot 框架, 在 Mac M3 笔记本上部署 SO-ARM101 六轴机械臂,从零到一搭建这套系统的全过程, 包括环境配置、硬件调试、遥操作、数据采集、云端训练( 在云服务器上完成模仿学习模型的训练与推理 ) 和模型部署等环节。过程中遇到的每…

作者头像 李华
网站建设 2026/7/16 8:45:14

10款国内外AI写小说软件实测:哪些能用,哪些容易踩坑(2026最新)

最近后台常有人问:写小说大纲卡住怎么办?写到一半没感觉了,还要不要硬写? 我写网文也有几年了,这种卡住的时刻太熟了。过去几个月,我把常见的写小说软件挨个试了一遍。有些适合找设定,有些适合…

作者头像 李华
网站建设 2026/7/16 8:42:33

PJSIP C++开发实战:从核心类解析到可运行SIP客户端构建

1. 项目概述:PJSIP库的C世界初探 如果你正在C领域里折腾音视频通信,无论是想做一个自己的软电话、一个带通话功能的IoT设备,还是一个嵌入式的对讲系统,那么PJSIP这个名字你大概率绕不过去。它是一个开源的、功能强大的SIP&#xf…

作者头像 李华
网站建设 2026/7/16 8:38:34

AI Agent环境构建:操作系统级运行时设计与实操

1. 项目概述:这不是搭个“环境”,而是给AI Agent装上操作系统 “Agent -Practice--build your agent environment”这个标题乍看像一句命令行提示,甚至有点像某个IDE报错后的临时笔记——但它背后藏着当前AI工程落地最核心的瓶颈:…

作者头像 李华