如何在聚合后的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
相关产品推荐
相关产品推荐

