pandas按人名分组提取最大体重对应完整记录的方法
pandas按分组取指定列最大值对应整行的实现方法
你现有代码的问题:
- 聚合时只选中了
age列计算最大值,自然不会返回weight列的数据 - 你的需求是取每个
name分组下weight值最大的完整记录,单独对某一列做聚合运算,没法自动匹配同一条记录的其他字段值
推荐实现方法(性能最优)
用idxmax()定位每个分组中weight最大值对应的原表行索引,直接筛选对应行后调整列顺序即可:
import pandas as pd data = {'name':['dave','bob','barry','bob','dave','barry'], 'age':[35,30,41,50,44,53], 'weight':[144,158,150,187,250,197]} df = pd.DataFrame(data) # 核心逻辑:分组找weight最大的行索引 → 筛选行 → 按要求排序列顺序 → 重置索引 result = df.loc[df.groupby('name')['weight'].idxmax(), ['name', 'age', 'weight']].reset_index(drop=True) print(result)
运行输出符合要求:
name age weight 0 barry 53 197 1 bob 50 187 2 dave 44 250
简易写法(适合小数据集)
先按weight降序排序,再按name去重保留第一条(也就是weight最大的记录),逻辑更直观:
result = df.sort_values('weight', ascending=False) \ .drop_duplicates(subset='name', keep='first') \ [['name', 'age', 'weight']] \ .reset_index(drop=True)
避坑提醒:不要直接使用
df.groupby('name').max()实现该需求,这种写法会对分组下的每一列独立计算最大值,会出现字段错配问题——如果某个name下age最大的记录和weight最大的记录不是同一条,返回的age和weight会来自不同行,结果完全错误。
内容的提问来源于stack exchange,提问作者PawPatrol
相关产品推荐
相关产品推荐

