You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

无需三层循环实现多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

火山引擎 最新活动