当前位置: 首页 > 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.cnnetsun.cn/news/3411287.html

相关文章:

  • 紧急!新修订《行政规范性文件管理办法》生效前72小时,ChatGPT政策比对工具包限时开放(含12类高频冲突条款识别规则集)
  • HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储
  • HarmonyOs应用《重要日》开发第7篇 - 日期处理:dayjs 集成与 DateUtil 封装
  • LMK61E0M DCXO实战:从I2C配置到环路滤波,打造70.656MHz高精度时钟
  • ArcGIS图层的符号绘制顺序(叠放次序)调整
  • Cursor AI布局切换实战手册(从VS Code迁移者必读):12个真实项目踩坑复盘与标准化配置模板
  • 零基础实战:手把手教你用NoneBot2与go-cqhttp搭建QQ机器人
  • Grok安全机制7日崩塌:大模型安全承诺的工程真相
  • 限时返场开源组件集成实践:风险评估与Spring Boot安全集成指南
  • STL之map与unordered_map:面试考红黑树和哈希表,这样答直接满分
  • DLPC910高速接口与像素映射:从电气设计到数据重排的工程实践
  • 网盘直链下载助手终极实战指南:5倍速下载技巧大公开
  • 高速ADC性能优化:从噪声原理到ADC31JB68寄存器配置实战
  • No-Code MVP:用可视化工具72小时验证商业假设
  • 2026年AI编程工具终极对决:我花了三个月,把Claude Code、Cursor、Copilot和国产工具全测了一遍
  • 遗传算法求解N皇后问题的Python实战与工程避坑指南
  • Obsidian五种同步策略详解:怎么根据设备角色设置仅发送、仅接收和双向同步
  • C++多线程TCP服务器实战:从线程池到高并发网络编程
  • Java 23 种设计模式:从踩坑到精通 | 番外:组合 vs 解释器 —— 结构树 vs 计算树
  • 深入解析SM320C6748-HIREL引脚复用:从配置表到工程实践
  • 1846_安全SPI:从协议演进到车规级安全通信的实践解析
  • 基于西门子plc 博图1200 基于西门子plc的药片自动装瓶12(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_
  • JLU吉林大学软件学院《计算机网络》核心考点与真题实战解析(2020级适用)
  • PostureGuard:基于智能眼镜的AI坐姿守护助手
  • 从“未能加载System.Net.Http”错误出发:深入解析.NET程序集绑定与版本冲突
  • 【C++提高】高精度加法
  • COST231-WI模型参数解析与MATLAB仿真实践
  • AI语音合成技术演进:从Tacotron到端到端神经网络声码器
  • 从教育焦虑到个性化学习:破解孩子学习动力的密码
  • 从选型到焊接:阻容封装尺寸速查与实战应用指南