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

影刀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]# 按指定顺序排列