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

如何在聚合后的DataFrame中按月份升序,按均值取每组Top/Bottom N服务?

Pandas分组聚合后按月筛选Top/Bottom N记录

需求说明

已通过以下代码完成分组聚合,得到包含多级列索引的结果集:

ISresult = h25.groupby(['month','impactedservice']).agg({'resolvetime': ['count','median','mean', 'min', 'max','std']})

现在需要:

  • 整体保持月份升序
  • 每个月内按resolvetime的**均值(mean)**排序
  • 每个月仅保留Top5(均值最高)或Bottom5(均值最低)的impactedservice记录,同时保留所有聚合指标

实现代码

方法1:分组+自定义筛选函数

# 定义函数:每个月取均值最高的Top5记录
def top5_per_month(group):
    return group.sort_values(('resolvetime', 'mean'), ascending=False).head(5)

# 定义函数:每个月取均值最低的Bottom5记录
def bottom5_per_month(group):
    return group.sort_values(('resolvetime', 'mean'), ascending=True).head(5)

# 应用筛选,自动保留月份升序
top5_result = ISresult.groupby('month', group_keys=False).apply(top5_per_month)
bottom5_result = ISresult.groupby('month', group_keys=False).apply(bottom5_per_month)

方法2:排名+布尔索引筛选

# 筛选Top5:按月计算均值排名(降序),取排名前5的记录
ISresult['mean_rank'] = ISresult.groupby('month')[('resolvetime', 'mean')].rank(ascending=False, method='first')
top5_result = ISresult[ISresult['mean_rank'] <= 5].drop(columns='mean_rank')

# 筛选Bottom5:按月计算均值排名(升序),取排名前5的记录
ISresult['mean_rank'] = ISresult.groupby('month')[('resolvetime', 'mean')].rank(ascending=True, method='first')
bottom5_result = ISresult[ISresult['mean_rank'] <= 5].drop(columns='mean_rank')

# 确保月份升序(若原索引已排序可省略)
top5_result = top5_result.sort_index(level='month', ascending=True)
bottom5_result = bottom5_result.sort_index(level='month', ascending=True)

关键说明

  • 多级列索引处理:排序时需指定完整列路径('resolvetime', 'mean'),匹配聚合后的列结构
  • 去重逻辑:排名时用method='first',避免因均值相同导致的重复排名,保证每个月严格输出5条记录
  • 顺序保持:原分组结果的索引已按month升序排列,筛选后默认保留该顺序,无需额外调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 22:23:13