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

如何在Pandas DataFrame中按Reference分组筛选Length最大的行?

嘿,这个需求在Pandas里有好几种靠谱的实现方式,我来给你一步步讲清楚,顺便帮你排查下之前用groupby没成功的可能原因~

首先先把你的示例数据构造出来,方便演示:

import pandas as pd

df = pd.DataFrame({
    'Reference': ['ref101', 'ref101', 'ref202', 'ref202'],
    'ID': [123456, 123789, 654321, 653212],
    'Length': [10, 5, 20, 40]
})

方法1:groupby + idxmax(最直接的分组定位法)

你之前用groupby没成功,大概率是直接用了max()聚合——这样会把每列都取最大值,导致ID列和Length列无法对应。而idxmax()能帮你找到每个组里Length最大值对应的行索引,再用loc提取整行就对了:

# 按Reference分组,获取每个组Length最大值的行索引
max_length_indices = df.groupby('Reference')['Length'].idxmax()
# 根据索引提取目标行
result = df.loc[max_length_indices]

运行后result就是你要的结果:

ReferenceIDLength
ref10112345610
ref20265321240

注意:如果同一个组里有多个行的Length值相同且都是最大值,idxmax()只会返回第一个出现的那一行的索引。

方法2:排序 + 去重(更直观的思路)

如果你觉得索引操作有点绕,可以先排序再去重:

# 先按Reference分组,再按Length降序排序,确保组内最大Length的行排在最前面
sorted_df = df.sort_values(['Reference', 'Length'], ascending=[True, False])
# 保留每个Reference的第一行(也就是Length最大的行)
result = sorted_df.drop_duplicates(subset='Reference', keep='first')

这种方法逻辑很直观,排序后每个组的目标行都在最顶端,去重时只保留第一个就搞定了。

方法3:transform标记法(适合保留多最大值行的场景)

如果你的数据里可能存在同一个组内多个行Length都是最大值的情况,想要把这些行都保留下来,就用transform:

# 给原DataFrame新增一列,标记该行是否是组内Length最大值
df['is_group_max'] = df.groupby('Reference')['Length'].transform(lambda x: x == x.max())
# 筛选出标记为True的行
result = df[df['is_group_max']]

比如如果ref101组里有两行Length都是10,这个方法会把两行都保留下来,而前两种方法只会留第一行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:19:00