我有一个数据框看起来像是

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.我想创建一个名为top 3的新列,它表示每个Group_ID的最大3个概率的位置,如果该行具有该Group_ID的最大概率,则top3=1,否则为零.因此,结果看起来像是:

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有关,但我不确定如何继续.提前谢谢您.

推荐答案

按降序使用groupy.rank,然后保持值≤(le)3,最后将布尔级数转换为带有astype的整数:

df['top3'] = (df.groupby('Group_ID')['probability']
                .rank('dense', ascending=False).le(3).astype(int)
             )

输出:

    Group_ID  probability  top3
0      34883     0.002676     0
1      34883     0.178263     1
2      34883     0.013998     0
3      34883     0.045698     0
4      34883     0.027995     0
5      34883     0.026348     0
6      34883     0.029230     0
7      34883     0.135447     0
8      34883     0.075957     0
9      34883     0.192466     1
10     34883     0.200288     1
11     34883     0.000000     0
12     34883     0.000000     0
13     34883     0.071634     0
14     34897     0.033298     0
15     34897     0.076440     0
16     34897     0.095707     0
17     34897     0.003770     0
18     34897     0.017801     0
19     34897     0.000838     0
20     34897     0.081257     0
21     34897     0.107644     0
22     34897     0.257801     1
23     34897     0.109110     1
24     34897     0.000000     0
25     34897     0.027435     0
26     34897     0.188901     1
27     34897     0.000000     0

Python相关问答推荐

Pandas 密集排名具有相同值,按顺序排列

如何输入提示抽象方法属性并让mypy高兴?

仅使用2种 colored颜色 创建热图

如何对行使用分段/部分.diff()或.pct_change()?

当测试字符串100%包含查询字符串时,为什么t fuzzywuzzy s Process.extractBests不给出100%分数?

为什么我的(工作)代码(生成交互式情节)在将其放入函数中时不再工作?

具有多个组的条形图的不同y标度

使用imap-tools时错误,其邮箱地址包含域名中的非默认字符

如何使用bs 4从元素中提取文本

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

理解Python的二分库:澄清bisect_left的使用

我从带有langchain的mongoDB中的vector serch获得一个空数组

将整组数组拆分为最小值与最大值之和的子数组

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

max_of_three使用First_select、second_select、

按顺序合并2个词典列表

Polars:用氨纶的其他部分替换氨纶的部分

删除字符串中第一次出现单词后的所有内容

如何更改分组条形图中条形图的 colored颜色 ?

如何在Python脚本中附加一个Google tab(已经打开)