如何按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
相关产品推荐
相关产品推荐

