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

Pandas实现:按组优先选取Possible为True的total最大值

解决方案

核心思路

通过排序优先级控制+分组取首行实现需求,既保证逻辑准确,又适配10万行级别的大数据量(底层优化过的向量操作,效率远高于循环):

  1. 先按分组键(如year)升序,再按Possible降序(让True的行排在同组最前面),最后按total降序(同Possible状态下,大值在前)
  2. 按分组键分组后取每组第一行,直接得到符合要求的结果:
    • 若组内有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:19:04