You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

两种方法执行后得到的结果如下,完全符合你的预期:

idlengthwidth
21212
41113
72233

补充说明:如果同一id分组下存在多条记录的length同时等于最小值,两种方法默认都会保留原数据中最先出现的那条记录。

内容的提问来源于stack exchange,提问作者Yokanishaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:31:36