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
相关产品推荐
相关产品推荐

