Pandas实现按id分组筛选length列最小值所在行
Pandas 按分组保留列最小值对应行的实现方案
你可以通过以下两种常用写法实现需求,输出结果完全匹配你的预期:
方法1:排序后去重(逻辑直观,适合小数据量场景)
核心逻辑:先将全量数据按length列升序排列,让每个id分组下length最小的记录排在分组最前,再按id去重仅保留第一条记录即可。
首先构造示例测试数据:
import pandas as pd # 构建和你示例一致的DataFrame df = pd.DataFrame({ 'id': [2,2,4,4,7,7,7,7], 'length': [12,13,14,11,34,33,40,22], 'width': [12,15,19,13,67,64,78,33] })
核心处理代码:
# 升序排序后按id去重保留首条,最后按id重排还原顺序、重置索引 result = df.sort_values(by='length', ascending=True)\ .drop_duplicates(subset='id', keep='first')\ .sort_values(by='id', ignore_index=True)
方法2:分组定位最小值索引(性能更优,适合大数据量场景)
核心逻辑:通过groupby按id分组,直接定位每组内length最小值对应的原生行索引,再通过索引筛选出完整行,不需要做全局排序,数据量较大时运行效率更高。
核心处理代码:
# 定位每个id分组下length最小值对应的行索引 min_row_index = df.groupby('id')['length'].idxmin() # 按索引取数后重置索引 result = df.loc[min_row_index].reset_index(drop=True)
两种方法执行后得到的结果如下,完全符合你的预期:
| id | length | width |
|---|---|---|
| 2 | 12 | 12 |
| 4 | 11 | 13 |
| 7 | 22 | 33 |
补充说明:如果同一
id分组下存在多条记录的length同时等于最小值,两种方法默认都会保留原数据中最先出现的那条记录。
内容的提问来源于stack exchange,提问作者Yokanishaa
相关产品推荐
相关产品推荐

