影刀RPA 数据对比分析:两表差异查找
影刀RPA 数据对比分析两表差异查找作者林焱什么情况用什么本月数据和上月数据对比找变化、实际数据和计划数据对比找差异、两份名单对比找出新增和删除的人。在影刀RPA里用pandas的merge和compare可以快速找出两个数据集之间的差异。适用场景月度数据对比、库存盘点对比、人员变动检测、价格变动监控、数据一致性校验。怎么做店群矩阵自动化突破运营极限两表对比找差异importpandasaspd# 读取两个表df_oldpd.read_excel(rC:\Data\june_data.xlsx)df_newpd.read_excel(rC:\Data\july_data.xlsx)# 方法1merge indicatormergeddf_new.merge(df_old,on订单ID,howouter,indicatorTrue# 添加_merge列标识来源)# 新增的行在new中有old中没有addedmerged[merged[_merge]left_only]# 删除的行在old中有new中没有removedmerged[merged[_merge]right_only]# 未变化的行unchangedmerged[merged[_merge]both]值变化检测deffind_value_changes(df_old,df_new,key_col,compare_colsNone): 找出值发生变化的行 key_col: 关联键列名 compare_cols: 要比较的列名列表None则比较所有列 # 合并两表mergeddf_new.merge(df_old,onkey_col,howinner,suffixes(_新,_旧))ifcompare_colsisNone:compare_cols[cforcindf_new.columnsifc!key_col]# 找出有变化的行changed_maskpd.Series(False,indexmerged.index)changes[]forcolincompare_cols:old_colf{col}_旧new_colf{col}_新ifold_colinmerged.columnsandnew_colinmerged.columns:# 比较值处理NaNcol_changed((merged[old_col].fillna(NULL)!merged[new_col].fillna(NULL)))changed_maskchanged_mask|col_changed changed_rowsmerged[changed_mask].copy()# 记录具体变化foridx,rowinchanged_rows.iterrows():forcolincompare_cols:old_valrow.get(f{col}_旧)new_valrow.get(f{col}_新)ifstr(old_val)!str(new_val):changes.append({关联键:row[key_col],字段:col,旧值:old_val,新值:new_val})returnpd.DataFrame(changes),changed_rows# 使用changes,changed_rowsfind_value_changes(df_old,df_new,key_col订单ID,compare_cols[金额,状态,产品名称])ifnotchanges.empty:changes.to_excel(rC:\Data\changes.xlsx,indexFalse)print(f发现{len(changes)}处变化)完整对比报告defgenerate_comparison_report(df_old,df_new,key_col,output_path):生成完整对比报告withpd.ExcelWriter(output_path,engineopenpyxl)aswriter:# 1. 概览summarypd.DataFrame({项目:[旧数据行数,新数据行数,新增行数,删除行数,变化行数,未变化行数],数量:[len(df_old),len(df_new),len(df_new[~df_new[key_col].isin(df_old[key_col])]),len(df_old[~df_old[key_col].isin(df_new[key_col])]),0,# 待计算0# 待计算]})# 2. 新增的记录addeddf_new[~df_new[key_col].isin(df_old[key_col])]added.to_excel(writer,sheet_name新增记录,indexFalse)# 3. 删除的记录removeddf_old[~df_old[key_col].isin(df_new[key_col])]removed.to_excel(writer,sheet_name删除记录,indexFalse)# 4. 值变化changes,changed_rowsfind_value_changes(df_old,df_new,key_col)changes.to_excel(writer,sheet_name值变化,indexFalse)# 更新概览summary.loc[summary[项目]变化行数,数量]len(changed_rows)summary.loc[summary[项目]未变化行数,数量](len(df_old)-len(removed)-len(changed_rows))summary.to_excel(writer,sheet_name对比概览,indexFalse)returnoutput_path# 使用generate_comparison_report(df_old,df_new,key_col订单ID,output_pathrC:\Data\comparison_report.xlsx)价格变动监控defmonitor_price_change(old_file,new_file,output_file):监控价格变动df_oldpd.read_excel(old_file)df_newpd.read_excel(new_file)# 合并对比mergeddf_new.merge(df_old[[SKU,价格]],onSKU,howleft,suffixes(_新,_旧))# 计算变化merged[价格变化]merged[价格_新]-merged[价格_旧]merged[变化幅度](merged[价格变化]/merged[价格_旧]*100).round(2)merged[变化方向]merged[价格变化].apply(lambdax:涨价ifx0else降价ifx0else不变![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/706773270e614d84a1c5f3291f3835b5.png#pic_center))# 筛选有变化的changedmerged[merged[价格变化]!0].copy()changedchanged.sort_values(变化幅度,ascendingFalse)changed.to_excel(output_file,indexFalse)# 统计print(f涨价:{len(changed[changed[变化方向]涨价])}个)print(f降价:{len(changed[changed[变化方向]降价])}个)print(f最大涨幅:{changed[变化幅度].max():.1f}%)print(f最大降幅:{changed[变化幅度].min():.1f}%)returnchanged影刀RPA对比流程【设置变量】 old_file rC:\Data\上月数据.xlsx new_file rC:\Data\本月数据.xlsx 【读取Excel文件】→ old_file → df_old 【读取Excel文件】→ new_file → df_new 【执行Python代码】 # 对比分析 report generate_comparison_report( df_old, df_new, key_col订单ID, output_pathrC:\Data\对比报告.xlsx ) 【发送邮件】 附件对比报告.xlsx 内容本月数据变化{新增X条删除Y条修改Z处}有什么坑temu店群自动化报活动案例坑1关联键类型不一致# 问题一边是int一边是strmerge匹配不上df_old[订单ID]df_old[订单ID].astype(int)df_new[订单ID]df_new[订单ID].astype(str)mergeddf_old.merge(df_new,on订单ID)# 结果为空# 解决统一类型df_old[订单ID]df_old[订单ID].astype(str).str.strip()df_new[订单ID]df_new[订单ID].astype(str).str.strip()坑2NaN比较结果意外# 问题NaN ! NaN 返回True导致没变化的数据也被标记为变化importnumpyasnp np.nannp.nan# False!np.nan!np.nan# True!# 解决用fillna统一处理old_valstr(row[f{col}_旧])ifpd.notna(row[f{col}_旧])elseNULLnew_valstr(row[f{col}_新])ifpd.notna(row[f{col}_新])elseNULLchangedold_val!new_val坑3列名冲突# 问题两表有同名列merge后自动加后缀_x _ymergeddf_new.merge(df_old,onID)# 金额列变成 金额_x 和 金额_y# 解决指定后缀![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f7f9352b74f7413896d4159dfbed240e.png#pic_center)mergeddf_new.merge(df_old,onID,suffixes(_新,_旧))# 金额_新 和 金额_旧更清晰坑4重复键导致行数膨胀# 问题df_old中某个ID有2条记录merge后变成2×N条mergeddf_new.merge(df_old,onID)# 行数暴增# 解决先去重df_old_uniquedf_old.drop_duplicates(subsetID,keeplast)mergeddf_new.merge(df_old_unique,onID,howleft)坑5大数据量对比内存不够# 解决分批对比defbatch_compare(df_old,df_new,key_col,batch_size10000):分批对比all_changes[]foriinrange(0,len(df_new),batch_size):batchdf_new.iloc[i:ibatch_size]![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0c23d6cfa5644c5f9a5e4d182c534b86.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/de24f98ccfc3426ab60f75b0dc18f06b.png#pic_center)changes,_find_value_changes(df_old,batch,key_col)all_changes.append(changes)print(f已处理{min(ibatch_size,len(df_new))}/{len(df_new)})returnpd.concat(all_changes,ignore_indexTrue)

相关新闻

OpenChem快速开始:5分钟搭建你的第一个分子属性预测模型 [特殊字符]

OpenChem快速开始:5分钟搭建你的第一个分子属性预测模型 [特殊字符]

OpenChem快速开始:5分钟搭建你的第一个分子属性预测模型 🚀 【免费下载链接】OpenChem OpenChem: Deep Learning toolkit for Computational Chemistry and Drug Design Research 项目地址: https://gitcode.com/gh_mirrors/op/OpenChem OpenChem…

2026/7/17 18:04:10阅读更多 →
电磁场与电磁波:本质区别与工程应用解析

电磁场与电磁波:本质区别与工程应用解析

1. 电磁场与电磁波的物理本质差异当我们在大学物理课本上第一次看到"电磁场"和"电磁波"这两个术语时,很多人会下意识地认为它们是同一种物理现象的不同表述。但当我真正开始研究天线设计时,才深刻理解到它们的本质区别就像"蓄水…

2026/7/17 17:59:10阅读更多 →
Spring Boot应用代码保护实战:XJar加密原理与部署指南

Spring Boot应用代码保护实战:XJar加密原理与部署指南

1. 项目概述:为什么你的Spring Boot应用需要“加密盔甲”?最近在跟几个做企业级应用开发的朋友聊天,发现大家普遍有个痛点:辛辛苦苦开发的Spring Boot应用,一旦打包成JAR或WAR交付出去,里面的核心业务逻辑、…

2026/7/17 17:59:10阅读更多 →
Mac平台SSH工具与免密登录配置指南

Mac平台SSH工具与免密登录配置指南

1. Mac上替代Xshell和Xftp的工具选择作为一名长期在Mac环境下工作的运维工程师,我深刻理解Windows用户转向Mac平台时面临的工具适配问题。Xshell和Xftp作为Windows平台经典的SSH和FTP工具,在Mac上确实没有官方版本。但经过多年实践,我发现Mac…

2026/7/17 19:09:21阅读更多 →
爵士舞《Whoa Oh》中级教程:44分钟完整跟练方案与动作分解

爵士舞《Whoa Oh》中级教程:44分钟完整跟练方案与动作分解

最近在整理舞蹈教学资源时,发现很多舞者对于如何系统学习《Whoa Oh》这首爵士舞存在困惑。特别是Mel Mah老师的中级教程,虽然内容优质但缺乏完整的学习路径指导。本文将基于CLI舞蹈网课平台,详细拆解这首44分37秒的完整教学视频,从…

2026/7/17 19:09:21阅读更多 →
程序员专属7分钟高效手臂训练:改善肩颈酸痛与拜拜肉

程序员专属7分钟高效手臂训练:改善肩颈酸痛与拜拜肉

最近在健身圈里,很多程序员朋友都在问:长时间敲代码导致的手臂松弛、肩颈酸痛,有没有什么高效的解决方案?传统的健身房训练耗时耗力,而普通的拉伸动作又效果有限。今天要介绍的这套"超模Nina Dapper 7分钟瘦手臂升…

2026/7/17 19:09:21阅读更多 →
SiYuan平板端手写笔记功能深度解析:数字墨水的完美融合

SiYuan平板端手写笔记功能深度解析:数字墨水的完美融合

SiYuan平板端手写笔记功能深度解析:数字墨水的完美融合 【免费下载链接】siyuan A privacy-first, self-hosted, fully open source personal knowledge management software, written in typescript and golang. 项目地址: https://gitcode.com/GitHub_Trending/…

2026/7/17 19:09:21阅读更多 →
Java开发效率提升:Spring Boot、Lombok与MapStruct实战指南

Java开发效率提升:Spring Boot、Lombok与MapStruct实战指南

最近在开发过程中,你是不是经常遇到这样的场景:明明写了很多代码,但真正核心的业务逻辑却被各种重复的配置、样板代码和工具类淹没?每次新项目都要重新搭建基础框架,复制粘贴相似的代码结构?如果你也有这样…

2026/7/17 19:09:21阅读更多 →
OpenStack Nova手动安装实战:云计算IaaS核心服务部署指南

OpenStack Nova手动安装实战:云计算IaaS核心服务部署指南

1. 项目概述:这不是 Laravel Nova,而是 OpenStack Nova——云平台的“计算调度中枢”看到标题“实训项目6 Nova 的手动安装与配置”,再结合热搜词里混杂着“华为nova 11”“codex安装”“vscode配置”等大量前端/开发工具关键词,我…

2026/7/17 19:04:20阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/17 13:22:23阅读更多 →
VS Code 高效配置与个性化定制全攻略

VS Code 高效配置与个性化定制全攻略

1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器,VS Code 的默认配置已经能满足基本需求,但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间,期间尝试过各种配置方案,总结出这套适合大多数…

2026/7/17 0:00:01阅读更多 →
从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。 对工程应用和在自己的图片上进行测试来…

2026/7/17 0:00:01阅读更多 →
WinRAR高效配置指南:从基础安装到高级压缩实战

WinRAR高效配置指南:从基础安装到高级压缩实战

前几天帮同事处理一个客户发来的压缩包,解压时系统自带的工具弹出一串乱码,换用 WinRAR 却顺利打开了。这种看似简单的场景,恰恰暴露了不同压缩工具在处理非标准编码、分卷压缩或加密文件时的差异。WinRAR 作为一款老牌工具,真正价…

2026/7/17 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/16 20:13:14阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/17 13:22:38阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/17 17:26:50阅读更多 →