导入多标签Excel后Pandas分组报KeyError,求解决方案
问题解决:多工作表Excel合并后的分组聚合KeyError
问题根源
- 合并所有工作表时,你把第一个带表头的sheet也按
header=None读取,导致原表头变成了数据行,列名还是默认的数字索引(0、1、4),所以分组时用"CONS"会提示列不存在。 - 日期转换只修改了第二行的单元格(
df_all[1][1]),其余行的日期还是字符串类型,后续调用dt.month会报错。
修正后的完整代码
import pandas as pd filepath = "Consumption_20221111_testdata.xlsx" # 1. 读取所有工作表:第一个sheet读表头,其余sheet不读表头 xls = pd.ExcelFile(filepath) sheet_names = xls.sheet_names # 读取第一个sheet(带表头) df_first = pd.read_excel(xls, sheet_name=sheet_names[0]) # 读取剩余sheet(无表头,复用第一个sheet的列名) df_list = [] for sheet in sheet_names[1:]: df_temp = pd.read_excel(xls, sheet_name=sheet, header=None, names=df_first.columns) df_list.append(df_temp) # 合并所有数据 df_all = pd.concat([df_first] + df_list, ignore_index=True) # 2. 清理不需要的列(用原表头列名直接删除,避免索引混乱) df_all = df_all.drop(columns=["PERIOD_ID", "DATA_FLAG"]) # 3. 删除最后一行(SQL查询详情)和全空行 df_all = df_all.drop(df_all.index[-1]) df_all = df_all.dropna(how='all') # 4. 批量转换日期列类型(替换为你实际的日期列名,比如原表头的"DATE") df_all["DATE"] = pd.to_datetime(df_all["DATE"]) # 5. 新增月份列并分组聚合 df_all["Month"] = df_all["DATE"].dt.month # 按参考项(原表头"REF")和月份分组,聚合消耗量("CONS") df_grouped = df_all.groupby(by=["REF", "Month"], as_index=False).agg({"CONS": "sum"}) print(df_grouped) print(df_grouped.dtypes)
关键说明
- 区分表头读取:第一个sheet保留表头读取,剩余sheet直接复用第一个sheet的列名,避免表头沦为数据行。
- 用实际列名操作:后续所有列操作都使用原表头的名称,不再依赖数字索引,彻底避免列删除后索引错位的问题。
- 批量转换日期:对整列执行日期转换,确保所有行的日期都被正确识别,后续
dt.month能正常调用。
快速确认原表头列名
如果不确定第一个sheet的列名,先执行以下代码查看:
xls = pd.ExcelFile(filepath) df_first = pd.read_excel(xls, sheet_name=xls.sheet_names[0]) print(df_first.columns)
再把代码中的列名替换成实际输出的名称即可。
内容的提问来源于stack exchange,提问作者Ryan1234
相关产品推荐
相关产品推荐

