Pandas如何使用agg获取分组后第一、第二大值及对应索引
解决方案
你之前调用agg做聚合的逻辑,只能为每个分组返回单值统计结果,无法输出单分组下多条记录。要获取每个分组下前N大的val值及对应的原始行索引,直接用分组TopN筛选逻辑实现即可。
最优实现
用pandas内置的nlargest方法实现,代码简洁、运行效率高,适配大数据量场景:
import pandas as pd # 复现示例源数据 df = pd.DataFrame({ "id": ["a", "a", "a", "b", "b"], "type1": ["main", "main", "main", "second", "second"], "val": [3, 5, 4, 80, 90] }) # 核心计算逻辑 result = ( df .groupby(["id", "type1"], group_keys=False) # 取每个分组内val列值最大的前2条记录 .nlargest(n=2, columns="val") .rename(columns={"val": "max"}) # 将原始行索引转为普通列命名为idxmax .reset_index(names="idxmax") # 调整列顺序匹配预期输出格式 [["id", "type1", "max", "idxmax"]] )
运行代码得到的输出完全匹配预期:
id type1 max idxmax 0 a main 5 1 1 a main 4 2 2 b second 90 4 3 b second 80 3
扩展说明
- 若需要取前3/前K大的值,直接修改
nlargest()的参数n为对应数值即可 - 若需要取最小的前N个值,将
nlargest替换为nsmallest即可
内容的提问来源于stack exchange,提问作者gh1222
相关产品推荐
相关产品推荐

