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

📅 2026/7/16 0:37:50
影刀RPA 数据合并:多表关联与拼接
影刀RPA 数据合并多表关联与拼接作者林焱什么情况用什么数据分散在多个文件里——销售数据在A表、客户信息在B表、产品信息在C表需要合并成一张完整报表。或者按月分开的12个文件需要拼成一整年的数据。在影刀RPA里用pandas的merge、concat、join可以完成各种数据合并需求。适用场景多源数据整合、月度数据拼接、主从表关联、多文件批量合并、数据补全。怎么做纵向拼接行扩展拼多多店群自动化报活动上架importpandasaspd# 多个文件按行拼接相同列结构df1pd.read_excel(rC:\Data\2026年1月.xlsx)df2pd.read_excel(rC:\Data\2026年2月.xlsx)df3pd.read_excel(rC:\Data\2026年3月.xlsx)# 简单拼接resultpd.concat([df1,df2,df3],ignore_indexTrue)# 批量拼接文件夹内所有Excelimportosdefconcat_folder(folder,pattern*.xlsx):拼接文件夹内所有Excelfiles[fforfinos.listdir(folder)iff.endswith(.xlsx)andnotf.startswith(~$)]files.sort()all_dfs[]forfinfiles:filepathos.path.join(folder,f)dfpd.read_excel(filepath)df[来源文件]f# 添加来源标记all_dfs.append(df)print(f读取:{f}({len(df)}行))resultpd.concat(all_dfs,ignore_indexTrue)print(f合并完成: 共{len(result)}行)returnresult# 使用df_allconcat_folder(rC:\Data\月度数据)df_all.to_excel(rC:\Data\全年数据.xlsx,indexFalse)横向关联列扩展# 两表按关联键合并salespd.read_excel(rC:\Data\销售数据.xlsx)# 订单ID, 产品ID, 数量, 金额productspd.read_excel(rC:\Data\产品主数据.xlsx)# 产品ID, 产品名称, 规格, 类别customerspd.read_excel(rC:\Data\客户信息.xlsx)# 客户ID, 客户名称, 地区, 联系方式# 关联产品信息resultpd.merge(sales,products,on产品ID,howleft)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b896fa972f2d479dbf8bedcf8d85518d.png#pic_center)# 再关联客户信息resultpd.merge(result,customers,on客户ID,howleft)result.to_excel(rC:\Data\完整数据.xlsx,indexFalse)merge的四种连接方式# 1. left join左连接保留左表所有行pd.merge(left,right,onID,howleft)# 左表有但右表没有的右表字段为NaN# 2. right join右连接保留右表所有行pd.merge(left,right,onID,howright)# 3. inner join内连接只保留两表都有的行pd.merge(left,right,onID,howinner)# 4. outer join外连接保留所有行pd.merge(left,right,onID,howouter)多键关联# 两个关联键地区产品确定一条价格salespd.read_excel(rC:\Data\销售.xlsx)pricespd.read_excel(rC:\Data\价格表.xlsx)# 按地区产品两个键关联resultpd.merge(sales,prices,![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/44da73909c164051ba93dee8666e6788.png#pic_center)on[地区,产品],howleft,suffixes(,_价格表)# 同名列加后缀区分)合并去重defmerge_and_dedup(dfs,key_col,sort_colNone): 合并多个DataFrame并去重 key_col: 去重依据列 sort_col: 排序列保留最新 combinedpd.concat(dfs,ignore_indexTrue)ifsort_col:combinedcombined.sort_values(sort_col,ascendingFalse)combinedcombined.drop_duplicates(subsetkey_col,keepfirst)combinedcombined.reset_index(dropTrue)returncombined# 使用合并3个月的客户数据按客户ID去重保留最新df1pd.read_excel(rC:\Data\客户_5月.xlsx)df2pd.read_excel(rC:\Data\客户_6月.xlsx)df3pd.read_excel(rC:\Data\客户_7月.xlsx)mergedmerge_and_dedup([df1,df2,df3],key_col客户ID,sort_col更新时间)合并结果验证defverify_merge(left,right,merged,key_col,howleft):验证合并结果print( 合并验证 )print(f左表行数:{len(left)})print(f右表行数:{len(right)})print(f合并后行数:{len(merged)})ifhowleft:iflen(merged)len(left):print(✓ 行数一致左连接正常)else:print(f✗ 行数不一致左表{len(left)}合并后{len(merged)})# 可能是右表有重复键# 检查未匹配的行ifhowleft:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a4c29ab4d1ff4c88874bfdc2917dd34e.png#pic_center)unmatchedmerged[merged.iloc[:,-1].isna()]iflen(unmatched)0:print(f未匹配行数:{len(unmatched)})unmatched_keysunmatched[key_col].unique()print(f未匹配的{key_col}:{list(unmatched_keys)[:10]}...)# 检查右表重复键right_dupright[right.duplicated(subsetkey_col,keepFalse)]iflen(right_dup)0:print(f⚠ 右表有{len(right_dup)}条重复键可能导致合并后行数膨胀)# 使用verify_merge(sales,products,result,key_col产品ID,howleft)影刀RPA合并流程【设置变量】 folder rC:\Data\各分店销售 output rC:\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_indexTrue) [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(rC:\Data\产品主数据.xlsx) result pd.merge(combined, products, on产品ID, howleft) # 3. 去重 result result.drop_duplicates(subset[订单ID]) # 4. 验证 print(f合并: {len(files)}个文件, {len(result)}行) 【写入Excel文件】→ result → output有什么坑坑1列名不一致导致拼接错列# 问题一个文件叫金额另一个叫总金额df1pd.DataFrame({订单:[A],金额:[100]})df2pd.DataFrame({订单:[B],总金额:[200]})pd.concat([df1,df2])# 会出现金额和总金额两列# 解决合并前统一列名df2df2.rename(columns{总金额:金额})pd.concat([df1,df2],ignore_indexTrue)坑2关联键重复导致行数膨胀# 问题右表有重复的产品IDmerge后行数翻倍resultpd.merge(sales,products,on产品ID)# 1000行变成1500行# 解决先检查右表是否有重复dupproducts[products.duplicated(subset产品ID)]![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/42d03488e3194017bb4fc0fba3f110dd.png#pic_center)iflen(dup)0:productsproducts.drop_duplicates(subset产品ID,keeplast)resultpd.merge(sales,products,on产品ID,howleft)坑3关联键数据类型不匹配# 问题左表ID是int右表ID是strpd.merge(df1,df2,onID)# 匹配结果为空# 解决统一类型df1[ID]df1[ID].astype(str)df2[ID]df2[ID].astype(str)resultpd.merge(df1,df2,onID,howleft)坑4concat后索引重复# 问题concat后索引有重复resultpd.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_indexTrueresultpd.concat([df1,df2],ignore_indexTrue)坑5合并后列顺序混乱# 问题merge后列顺序不是想要的resultpd.merge(sales,products,on产品ID)# 产品名称可能跑到最后![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8fc128a2340a4d449347d5d7107706ea.png#pic_center)# 解决指定列顺序column_order[订单ID,日期,客户ID,客户名称,产品ID,产品名称,数量,金额]resultresult[column_order]# 按指定顺序排列