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

