无需三层循环实现多Excel工作表同位置表格数据求和聚合
嘿,这个场景我太有经验了!用三层循环处理大量工作表的聚合,不仅代码写起来麻烦,数据量大的时候速度慢到让人崩溃。咱们直接用pandas来搞定,全程用矢量运算,完全不用嵌套循环,效率拉满。
核心思路
利用pandas的批量读取+分组求和能力,所有操作都是底层优化过的矢量运算,比Python原生循环快几个数量级,完美适配你说的“工作表多、数据维度大”的场景。
具体实现步骤
1. 先装依赖
首先确保你安装了pandas和处理Excel的引擎(openpyxl用于xlsx格式,xlrd用于xls):
pip install pandas openpyxl
2. 编写可运行代码
每一步都加了注释,直接替换路径就能用:
import pandas as pd # 替换成你的Excel文件实际路径 excel_file = "你的工作簿名称.xlsx" # 1. 批量读取所有工作表的目标区域(I9起始) data_frames = [] with pd.ExcelFile(excel_file) as xls: # 遍历工作簿里的每个工作表 for sheet_name in xls.sheet_names: # 精准读取I9开始的数据: # - skiprows=8:跳过前8行(I9是第9行,索引从0开始计数) # - usecols="I:":只读取I列及右侧所有列 # - header=None:表示数据没有表头,第一列是AA/AT这类行标识 df = pd.read_excel(xls, sheet_name=sheet_name, skiprows=8, usecols="I:", header=None) # 把第一列设为行索引,方便后续按标识分组求和 df = df.set_index(0) data_frames.append(df) # 2. 合并所有数据并按行标识自动求和 # concat纵向合并所有表,groupby按行索引(AA/AT等)分组,sum自动对每列做聚合 aggregated_result = pd.concat(data_frames).groupby(level=0).sum() # 3. 将结果写入原工作簿的新工作表 # mode="a"表示追加模式,if_sheet_exists="replace"表示如果"聚合结果"表已存在就替换 with pd.ExcelWriter(excel_file, mode="a", engine="openpyxl", if_sheet_exists="replace") as writer: # startrow=8、startcol=8对应写入到I9位置(行和列都从0开始计数) aggregated_result.to_excel(writer, sheet_name="聚合结果", startrow=8, startcol=8)
为什么这个方法比循环好?
- 无嵌套循环:所有核心操作(合并、求和)都是pandas底层用C实现的矢量运算,彻底避免了Python循环的性能开销
- 自动处理差异:如果不同工作表的行顺序不一样、甚至有缺失的行,
groupby会自动对齐行标识,缺失的行在求和时会被当作0处理 - 可扩展性强:不管你有10个还是1000个工作表,代码都不用改,运行效率不会有明显下降
额外注意点
- 如果你的Excel是
.xls格式,把代码里的engine="openpyxl"改成engine="xlrd"即可 - 如果原始数据的行标识(AA/AT这些)有重复,
groupby会自动把同一标识的行合并求和,完全符合需求
内容的提问来源于stack exchange,提问作者Tanmay




