如何在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就是你要的结果:
| Reference | ID | Length |
|---|---|---|
| ref101 | 123456 | 10 |
| ref202 | 653212 | 40 |
注意:如果同一个组里有多个行的
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
相关产品推荐
相关产品推荐

