当前位置: 首页 > news >正文

影刀RPA 数据合并:多表关联与拼接

影刀RPA 数据合并:多表关联与拼接

作者:林焱

什么情况用什么

数据分散在多个文件里——销售数据在A表、客户信息在B表、产品信息在C表,需要合并成一张完整报表。或者按月分开的12个文件需要拼成一整年的数据。在影刀RPA里用pandas的merge、concat、join可以完成各种数据合并需求。

适用场景:多源数据整合、月度数据拼接、主从表关联、多文件批量合并、数据补全。

怎么做

纵向拼接(行扩展)

拼多多店群自动化报活动上架!

importpandasaspd# 多个文件按行拼接(相同列结构)df1=pd.read_excel(r"C:\Data\2026年1月.xlsx")df2=pd.read_excel(r"C:\Data\2026年2月.xlsx")df3=pd.read_excel(r"C:\Data\2026年3月.xlsx")# 简单拼接result=pd.concat([df1,df2,df3],ignore_index=True)# 批量拼接文件夹内所有Excelimportosdefconcat_folder(folder,pattern='*.xlsx'):"""拼接文件夹内所有Excel"""files=[fforfinos.listdir(folder)iff.endswith('.xlsx')andnotf.startswith('~$')]files.sort()all_dfs=[]forfinfiles:filepath=os.path.join(folder,f)df=pd.read_excel(filepath)df['来源文件']=f# 添加来源标记all_dfs.append(df)print(f"读取:{f}({len(df)}行)")result=pd.concat(all_dfs,ignore_index=True)print(f"合并完成: 共{len(result)}行")returnresult# 使用df_all=concat_folder(r"C:\Data\月度数据")df_all.to_excel(r"C:\Data\全年数据.xlsx",index=False)

横向关联(列扩展)

# 两表按关联键合并sales=pd.read_excel(r"C:\Data\销售数据.xlsx")# 订单ID, 产品ID, 数量, 金额products=pd.read_excel(r"C:\Data\产品主数据.xlsx")# 产品ID, 产品名称, 规格, 类别customers=pd.read_excel(r"C:\Data\客户信息.xlsx")# 客户ID, 客户名称, 地区, 联系方式# 关联产品信息result=pd.merge(sales,products,on='产品ID',how='left')![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b896fa972f2d479dbf8bedcf8d85518d.png#pic_center)# 再关联客户信息result=pd.merge(result,customers,on='客户ID',how='left')result.to_excel(r"C:\Data\完整数据.xlsx",index=False)

merge的四种连接方式

# 1. left join(左连接):保留左表所有行pd.merge(left,right,on='ID',how='left')# 左表有但右表没有的,右表字段为NaN# 2. right join(右连接):保留右表所有行pd.merge(left,right,on='ID',how='right')# 3. inner join(内连接):只保留两表都有的行pd.merge(left,right,on='ID',how='inner')# 4. outer join(外连接):保留所有行pd.merge(left,right,on='ID',how='outer')

多键关联

# 两个关联键:地区+产品确定一条价格sales=pd.read_excel(r"C:\Data\销售.xlsx")prices=pd.read_excel(r"C:\Data\价格表.xlsx")# 按地区+产品两个键关联result=pd.merge(sales,prices,![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/44da73909c164051ba93dee8666e6788.png#pic_center)on=['地区','产品'],how='left',suffixes=('','_价格表')# 同名列加后缀区分)

合并去重

defmerge_and_dedup(dfs,key_col,sort_col=None):""" 合并多个DataFrame并去重 key_col: 去重依据列 sort_col: 排序列(保留最新) """combined=pd.concat(dfs,ignore_index=True)ifsort_col:combined=combined.sort_values(sort_col,ascending=False)combined=combined.drop_duplicates(subset=key_col,keep='first')combined=combined.reset_index(drop=True)returncombined# 使用:合并3个月的客户数据,按客户ID去重保留最新df1=pd.read_excel(r"C:\Data\客户_5月.xlsx")df2=pd.read_excel(r"C:\Data\客户_6月.xlsx")df3=pd.read_excel(r"C:\Data\客户_7月.xlsx")merged=merge_and_dedup([df1,df2,df3],key_col='客户ID',sort_col='更新时间')

合并结果验证

defverify_merge(left,right,merged,key_col,how='left'):"""验证合并结果"""print("=== 合并验证 ===")print(f"左表行数:{len(left)}")print(f"右表行数:{len(right)}")print(f"合并后行数:{len(merged)}")ifhow=='left':iflen(merged)==len(left):print("✓ 行数一致(左连接正常)")else:print(f"✗ 行数不一致!左表{len(left)},合并后{len(merged)}")# 可能是右表有重复键# 检查未匹配的行ifhow=='left':![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a4c29ab4d1ff4c88874bfdc2917dd34e.png#pic_center)unmatched=merged[merged.iloc[:,-1].isna()]iflen(unmatched)>0:print(f"未匹配行数:{len(unmatched)}")unmatched_keys=unmatched[key_col].unique()print(f"未匹配的{key_col}:{list(unmatched_keys)[:10]}...")# 检查右表重复键right_dup=right[right.duplicated(subset=key_col,keep=False)]iflen(right_dup)>0:print(f"⚠ 右表有{len(right_dup)}条重复键,可能导致合并后行数膨胀")# 使用verify_merge(sales,products,result,key_col='产品ID',how='left')

影刀RPA合并流程

【设置变量】 folder = r"C:\Data\各分店销售" output = r"C:\Data\全店汇总.xlsx" 【执行Python代码】 # 1. 读取并拼接所有文件 import os files = [f for f in os.listdir(folder) if f.endswith('.xlsx')] all_data = [] for f in files: df = pd.read_excel(os.path.join(folder, f)) df['来源'] = f.replace('.xlsx', '') all_data.append(df) combined = pd.concat(all_data, ignore_index=True) [video(video-UVkiRPy3-1784132999205)(type-csdn)(url-https://live.csdn.net/v/embed/526817)(image-https://v-blog.csdnimg.cn/asset/1d3c3709da119dd8c13ab01e9b282520/cover/Cover0.jpg)(title-TEMU店群矩阵自动化运营核价报活动)] # 2. 关联产品信息 products = pd.read_excel(r"C:\Data\产品主数据.xlsx") result = pd.merge(combined, products, on='产品ID', how='left') # 3. 去重 result = result.drop_duplicates(subset=['订单ID']) # 4. 验证 print(f"合并: {len(files)}个文件, {len(result)}行") 【写入Excel文件】→ result → output

有什么坑

坑1:列名不一致导致拼接错列

# 问题:一个文件叫"金额",另一个叫"总金额"df1=pd.DataFrame({'订单':['A'],'金额':[100]})df2=pd.DataFrame({'订单':['B'],'总金额':[200]})pd.concat([df1,df2])# 会出现"金额"和"总金额"两列# 解决:合并前统一列名df2=df2.rename(columns={'总金额':'金额'})pd.concat([df1,df2],ignore_index=True)

坑2:关联键重复导致行数膨胀

# 问题:右表有重复的产品ID,merge后行数翻倍result=pd.merge(sales,products,on='产品ID')# 1000行变成1500行# 解决:先检查右表是否有重复dup=products[products.duplicated(subset='产品ID')]![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/42d03488e3194017bb4fc0fba3f110dd.png#pic_center)iflen(dup)>0:products=products.drop_duplicates(subset='产品ID',keep='last')result=pd.merge(sales,products,on='产品ID',how='left')

坑3:关联键数据类型不匹配

# 问题:左表ID是int,右表ID是strpd.merge(df1,df2,on='ID')# 匹配结果为空# 解决:统一类型df1['ID']=df1['ID'].astype(str)df2['ID']=df2['ID'].astype(str)result=pd.merge(df1,df2,on='ID',how='left')

坑4:concat后索引重复

# 问题:concat后索引有重复result=pd.concat([df1,df2])# df1索引 0,1,2 + df2索引 0,1,2 = 0,1,2,0,1,2![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/603ee4a82f8a4efb8c58c6434c4493dd.png#pic_center)# 解决:ignore_index=Trueresult=pd.concat([df1,df2],ignore_index=True)

坑5:合并后列顺序混乱

# 问题:merge后列顺序不是想要的result=pd.merge(sales,products,on='产品ID')# 产品名称可能跑到最后![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8fc128a2340a4d449347d5d7107706ea.png#pic_center)# 解决:指定列顺序column_order=['订单ID','日期','客户ID','客户名称','产品ID','产品名称','数量','金额']result=result[column_order]# 按指定顺序排列
http://www.jsqmd.com/news/1196979/

相关文章:

  • 宝玑官方服务项目及价格查询|网点地址与热线权威信息声明(2026年7月最新) - 亨得利钟表维修中心
  • 第七届心理健康与教育、人文发展国际学术会议(MHEHD 2026)
  • NAND FLASH ECC算法演进:从汉明码到BCH的硬件实现与选型指南
  • 大模型语音机器人如何实现复杂意图理解?——从技术原理到SIP协同实践
  • 洪山软件开发公司本地化服务能力及技术落地要点详解 - 热点品牌推荐
  • 欧米茄中国官方售后服务中心|官方电话和维修地址权威信息声明(2026年7月更新) - 欧米茄官方服务中心
  • 智慧校园应用服务系统:驱动教育数字化转型的核心引擎
  • 苹果的“拥抱”与“超越”:解构基于 Google Gemini 的新一代 AI 架构
  • 2026年如何选择靠谱的免洗手液供应商 - 热点品牌推荐
  • “高校生活”网上订餐系统的设计与实现开题报告
  • 鸿蒙 ArkTS 实战:Travel Budget Ledger 从出行记录到状态反馈完整解析
  • STM32与SX1262实战:从驱动移植到LoRaWAN节点开发
  • 2026年华北区域专业靠谱的制氢充电优质公司哪家比较不错 - 热点品牌推荐
  • tensormsg错误排查:10个常见问题与解决方案终极指南
  • 多渠道客服接入升级:电话+在线咨询统一接入、统一回复、统一管理
  • 贵港2026年宣传片拍摄公司年度权威排名报告|正规机构深度评测服务对比一站式AI视频剪辑包装拍摄报价选择指南解析 - 全国影像制作行业测评
  • 权威评测:济南影视全案策划机构TOP10精选|2026年度最新测评结果全流程服务标准与价格透明说明及选型参考完整指南 - 全国影像制作行业测评
  • 2026年国内古建门头优质生产厂家选购实用参考指南 - 热点品牌推荐
  • ACK 等级详解:从概念到实践
  • 入职两个月仅手写100行代码,Git提交10000行,OpenSpec改变程序员工作方式
  • 鸿蒙 ArkTS 实战:Family Meetup Location 从出行记录到状态反馈完整解析
  • 鸣潮工具箱:你的游戏体验为何总比别人差一步?
  • 乡政府科学管理系统开题报告
  • 2026年廊坊砂纸选购攻略 适配多场景的实用选品指引 - 热点品牌推荐
  • 深入UDS诊断:0x83服务如何精准调控通信时序参数
  • 学生综合素质评价企业排名
  • Cursor AI搜索筛选失效真相(2024最新内核解析):VS Code插件底层机制与5大常见误用陷阱
  • 浪琴中国官方售后服务中心|全部地址与客服热线权威信息声明(2026年7月更新) - 浪琴服务中心
  • 找厦门室外地坪漆源头厂家 本地高品质供应商选型指南 - 热点品牌推荐
  • 综合评测:佛山商业摄影机构TOP10精选|2026年度最新测评结果全流程服务标准与价格透明说明及选型参考完整指南 - 全国影像制作行业测评