如何遍历Excel多工作表提取数据并生成指定格式Pandas DataFrame
解决方案
现有代码问题排查
你的核心错误有两点:
- openpyxl的行、列索引均从1开始计数,你写的
min_row=0、min_col=0属于非法参数,会直接报错 - 你只是把值打印输出,没有整理成统一结构的结构化数据,自然无法转成DataFrame
方案1:使用Pandas直接处理(更简便)
针对复合表头的Excel,Pandas支持直接读取多重索引表头,代码更简洁:
import pandas as pd # 定义单个工作表的处理函数 def process_sheet(sheet_name): # header=[0,1]指定前两行作为复合列索引,index_col=0指定第一列作为行索引 df = pd.read_excel("df.xlsx", sheet_name=sheet_name, header=[0,1], index_col=0) df = df.T # 转置表,把季度/年从列维度转成行维度 df = df.reset_index() # 把索引转成普通列 df.columns = ["year", "quarter", "ID", "ID2", "name"] # 重命名列 return df # 分别处理两个工作表后合并 df_sheet1 = process_sheet("Sheet1") df_sheet2 = process_sheet("Sheet2") final_df = pd.concat([df_sheet1, df_sheet2], ignore_index=True) # 筛选q1的数据,不需要筛选的话删除此行即可保留所有季度数据 final_df = final_df[final_df["quarter"] == "q1"].reset_index(drop=True) print(final_df)
方案2:基于openpyxl的修改方案
如果你需要用openpyxl原生处理,修改代码如下:
import openpyxl import pandas as pd wb = openpyxl.load_workbook("df.xlsx") sheets = [wb.worksheets[0], wb.worksheets[1]] data_list = [] for ws in sheets: # 读取表头值 year = ws[1][1].value # 第一行第二列是q1对应的年份 quarter = ws[2][1].value # 第二行第二列是q1标识 # 读取指标值 id_val = ws[3][1].value id2_val = ws[4][1].value name_val = ws[5][1].value # 组装成字典存入列表 data_list.append({ "quarter": quarter, "year": year, "ID": id_val, "ID2": id2_val, "name": name_val }) # 直接转DataFrame final_df = pd.DataFrame(data_list) print(final_df)
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

