Pandas实现:按组优先选取Possible为True的total最大值
解决方案
核心思路
通过排序优先级控制+分组取首行实现需求,既保证逻辑准确,又适配10万行级别的大数据量(底层优化过的向量操作,效率远高于循环):
- 先按分组键(如
year)升序,再按Possible降序(让True的行排在同组最前面),最后按total降序(同Possible状态下,大值在前) - 按分组键分组后取每组第一行,直接得到符合要求的结果:
- 若组内有
Possible=True的行,第一行就是其中total最大的 - 若组内全为
Possible=False,第一行就是该组total最大的
- 若组内有
代码实现
仅按year分组的场景
# 按优先级排序:year升序 → Possible降序(True在前) → total降序 df_sorted = df.sort_values( by=['year', 'Possible', 'total'], ascending=[True, False, False] ) # 按year分组,取每组第一行,保留所有列 result = df_sorted.groupby('year', as_index=False).first()
按col、row、year、No、potveg多维度分组的场景
如果你的实际分组维度是这几个字段的组合,只需调整排序和分组的键:
df_sorted = df.sort_values( by=['col', 'row', 'year', 'No', 'potveg', 'Possible', 'total'], ascending=[True, True, True, True, True, False, False] ) result = df_sorted.groupby(['col', 'row', 'year', 'No', 'potveg'], as_index=False).first()
逻辑验证
举几个典型场景验证:
- 场景1:组内有
True和False,且False的total更大
原数据:Possible | total
False | 200
True | 180
True | 150
排序后顺序:True(180)→True(150)→False(200),取第一行得到True且total最大的180,符合优先选True的要求 - 场景2:组内全为
False
原数据:Possible | total
False | 200
False | 150
排序后第一行是200,直接取组内最大total,符合需求 - 场景3:组内
True的行有多个
原数据:Possible | total
True | 100
True | 90
False | 150
排序后第一行是100,即True中最大的total,符合要求
为什么之前的Stack Overflow方案可能失效
多数方案要么只按total排序取最大,未考虑Possible的优先级;要么用循环逐组判断,效率低且容易出现重复/遗漏年份的问题。本方案通过一次排序+分组取首行,既保证逻辑严谨,又适配大数据量的性能需求。
内容的提问来源于stack exchange,提问作者code_error
相关产品推荐
相关产品推荐

