You need to enable JavaScript to run this app. Pandas多索引GroupBy后提取每个年份分组count最高的首行数据
优惠活动
大模型
产品
解决方案
定价
更多

Pandas多索引GroupBy后提取每个年份分组count最高的首行数据

针对当前已排序MultiIndex聚合结果的提取方法

你的数据已经提前完成了两个关键前置准备,不需要额外重复计算,实现逻辑非常直接:

  • 聚合DataFrame为两层MultiIndex,第一层索引为year、第二层为product
  • 每个year分组内已按count列降序排列,同count值的行优先级(如2016年同值的A、B顺序)完全符合你的输出预期

推荐最优实现(零额外计算开销)

直接按MultiIndex的year层级分组,取每组的首行即可,对应代码:
top_df = df.groupby(level=0).head(1)
这个实现的适配性体现在:

  • 完全保留你当前的行顺序,不会打乱同count值的条目优先级:2016年两个count=7的产品会直接取排序靠前的product A,不存在同值随机选取的问题,100%匹配你预期的输出结果
  • 不需要重复对count列做全表排序,相比其他需要二次计算的方法性能更高
  • 完整保留原表的MultiIndex结构与所有列(count、sum),不会出现字段缺失

备选实现(适合不确定原有排序状态时做校验)

如果你无法确认之前的排序是否准确,可以直接基于count最大值定位行,不依赖原有行顺序:

  1. 先获取每个year分组下count最大值对应的MultiIndex:
    max_row_idx = df.groupby(level=0)['count'].idxmax()
  2. 按获取到的索引提取对应行:
    top_df = df.loc[max_row_idx]

注意:pandas的idxmax()遇到组内同最大值的场景时,默认返回最先出现的记录的索引,在你当前已排序的状态下,取到的结果和head(1)方法完全一致,不会和2016年取product A的预期冲突。


常见踩坑提醒

  • 不要直接使用df.groupby(level=0).max()做提取:这个方法是对每列单独取最大值,会把不同行的字段拼接错位,比如2015年会错误得到count=9、sum=46的不匹配记录,不是同一个product的真实值
  • groupby时必须指定level=0对应year层级:如果省略level参数,groupby会默认按所有MultiIndex列分组,完全达不到按年份拆分的效果

最终输出的结果会和你的预期完全一致:

  • 2015年对应记录:product A,count=9,sum=23
  • 2016年对应记录:product A,count=7
  • 2017年对应记录:product B,count=9
  • 2018年对应记录:product A,count=3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 04:36:05