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

Pandas多索引groupby返回多余行 如何得到50行年度气温统计结果

问题根因

该问题是pandas对分类(category)类型字段执行分组时的默认行为导致的:

  • 你的代码中将year和decade都显式转换为了category类型
  • pandas groupby方法默认参数observed=False,针对分类变量会返回所有分类值的笛卡尔积组合(5个年代×50个年份=250种组合),哪怕这些组合在数据集里不存在,不存在的组合会返回填充值(你看到的0就是这类组合的聚合结果)
    Excel透视表默认仅展示数据中实际存在的分组组合,所以不会出现冗余行,和pandas调整参数后的逻辑一致。

解决方案

方案1:groupby时添加observed=True参数(最推荐)

该参数会让groupby仅返回数据中实际存在的分组组合,不会生成冗余的笛卡尔积,直接得到预期的50行结果,无需后续删行操作。仅需修改groupby代码行即可:

grouped = df.groupby(['decade','year'], observed=True)['temperature'].mean()

修改后输出的len(grouped)即为50,也不会出现无数据组合的0值。

方案2:不将年份、年代转为分类类型

如果你不需要用到category类型的特殊特性,可以移除转category的代码,用默认的int类型存储year和decade,groupby默认也只会返回实际存在的分组:

# 去掉.astype('category')声明
df['year'] = df.index.year
# ...
df['decade'] = pd.cut(df['year'], bins=cut_bins, labels=cut_labels, include_lowest=True)

内容的提问来源于stack exchange,提问作者Hurzinger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:06:02