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

如何按Group_ID分组,为每组概率前3的行生成top3标记列

问题

现有如下DataFrame:

Group_ID    probability 
34883       0.002676    
34883       0.17826266  
34883       0.01399753  
34883       0.04569782  
34883       0.02799506  
34883       0.02634829  
34883       0.02923014  
34883       0.13544669  
34883       0.07595718  
34883       0.19246604  
34883       0.20028818  
34883       0           
34883       0           
34883       0.07163442  
34897       0.03329843  
34897       0.07643979  
34897       0.09570681  
34897       0.00376963  
34897       0.01780105  
34897       0.0008377   
34897       0.08125654  
34897       0.10764398  
34897       0.25780105  
34897       0.10910995  
34897       0           
34897       0.02743455  
34897       0.18890052  
34897       0           

每个Group_ID对应的probability列数值总和为1。需要创建名为top3的新列,标记每个分组中概率排名前3的行:属于前3则为1,否则为0,预期输出如下:

Group_ID    probability top3
34883       0.002676    0
34883       0.17826266  1
34883       0.01399753  0
34883       0.04569782  0
34883       0.02799506  0
34883       0.02634829  0
34883       0.02923014  0
34883       0.13544669  0
34883       0.07595718  0
34883       0.19246604  1
34883       0.20028818  1
34883       0           0
34883       0           0
34883       0.07163442  0
34897       0.03329843  0
34897       0.07643979  0
34897       0.09570681  0
34897       0.00376963  0
34897       0.01780105  0
34897       0.0008377   0
34897       0.08125654  0
34897       0.10764398  0
34897       0.25780105  1
34897       0.10910995  1
34897       0           0
34897       0.02743455  0
34897       0.18890052  1
34897       0           0

考虑过用idxmax但不确定具体实现方式,求指导。

解决方案

不需要用idxmax,用groupby结合rank或者nlargest都能实现,这里推荐两种简洁的方法:

方法一:使用rank函数

通过分组对probability列降序排名,然后判断排名是否≤3:

import pandas as pd

# 假设你的DataFrame名为df
df['top3'] = df.groupby('Group_ID')['probability'].rank(ascending=False, method='first').le(3).astype(int)
  • rank(ascending=False):按概率降序排名
  • method='first':处理并列值时,保留原始顺序(避免多个行排名相同导致超过3个1的情况)
  • le(3):判断排名是否小于等于3,返回布尔值
  • astype(int):把布尔值转为0/1

方法二:使用nlargest标记

先找出每个分组中前3大的概率值,再匹配标记:

# 获取每个分组前3大的概率值
top3_probs = df.groupby('Group_ID')['probability'].nlargest(3).reset_index(level=0, drop=True)
# 匹配并标记
df['top3'] = df['probability'].isin(top3_probs).astype(int)

注意:如果分组中有多个相同的概率值刚好排在第3位,这种方法会把所有等于该值的行都标记为1,若要避免这种情况,优先用方法一。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:50:07