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

Pandas双列分组后如何获取每个一级分组下的最大值子组记录

实现方法

你可以通过以下两种常用方案实现需求:

方案1:基于你已有的分组结果二次处理

你已经完成了sp+mt维度的最大值计算,只需对该结果按sp层级分组取最大值即可:

import pandas as pd

# 你的原始DataFrame
df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'count' : [3,2,5,8,10,1,2,2,7]
})

# 你已有的第一步分组结果
grouped_max = df.groupby(["sp", "mt"])['count'].max()

# 二次按sp分组取每组最大值
final_result = grouped_max.groupby(level='sp').nlargest(1).reset_index(level=0, drop=True)

运行后final_result的输出就和你期望的结果完全一致。

方案2:直接对原始DataFrame一次性处理

如果不需要中间的sp+mt分组结果,可以直接按sp分组定位最大值行,效率更高:

# 定位每个sp分组下count最大的行索引
max_idx = df.groupby('sp')['count'].idxmax()
# 提取对应行后按sp、mt去重聚合(避免同sp同mt有多条相同最大值的情况)
final_result = df.loc[max_idx].groupby(['sp','mt'])['count'].max()

同sp下多子组并列最大值的处理

如果某个sp下存在多个mt的count值同为最大值,想要全部保留,可以用如下写法:

# 生成最大值筛选掩码
max_mask = df.groupby('sp')['count'].transform('max') == df['count']
# 筛选后按sp、mt聚合
final_result = df[max_mask].groupby(['sp','mt'])['count'].max()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:36:09