You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

导入多标签Excel后Pandas分组报KeyError,求解决方案

问题解决:多工作表Excel合并后的分组聚合KeyError

问题根源

  1. 合并所有工作表时,你把第一个带表头的sheet也按header=None读取,导致原表头变成了数据行,列名还是默认的数字索引(0、1、4),所以分组时用"CONS"会提示列不存在。
  2. 日期转换只修改了第二行的单元格(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:20:57