Pandas groupby取最大值时如何保留对应非分组列
需求说明
现有如下测试DataFrame:
import pandas as pd df = pd.DataFrame({ "id": ["a", "a", "a", "b", "b"], "type1": ["main", "main", "main", "second", "second"], "type2": ["regular", "unregular", "large", "regular", "unregular"], "val": [3,5,3,80,90] })
按id、type1列分组取val列最大值时,直接使用df.groupby(["id","type1"])["val"].max().reset_index()仅会返回分组键和聚合后的val列,丢失最大值对应的type2字段,需要保留完整行数据。
实现方案
方案1:idxmax定位行索引(单最大值场景首选)
groupby的idxmax()方法会直接返回每个分组中val取最大值的行在原表中的索引,用loc筛选对应行即可保留全部字段:
res = df.loc[df.groupby(["id", "type1"])["val"].idxmax()].reset_index(drop=True)
运行后输出结果完全匹配预期:
id type1 type2 val 0 a main unregular 5 1 b second unregular 90
方案2:transform匹配最大值(适合保留并列最大值场景)
如果分组内可能存在多个val等于最大值的行、需要全部保留,可以用transform把分组最大值广播到每一行,再做布尔筛选:
res = df[df["val"] == df.groupby(["id", "type1"])["val"].transform("max")].reset_index(drop=True)
注意:如果同组存在多个最大值行,该方法会返回所有符合条件的行,方案1的idxmax()仅会返回分组内第一个出现的最大值行,可根据业务场景选择。
内容的提问来源于stack exchange,提问作者gh1222
相关产品推荐
相关产品推荐

