如何为Pandas DataFrame新增win列:按ID标记高分获胜者
给Pandas DataFrame按组标记胜负列
原始数据
id points 677 5 677 15 678 25 678 6
需求
每个id对应两行数据(代表一场比赛),新增win列:同一id下分数更高的行标记为1,分数更低的标记为0,最终效果如下:
id points win 677 5 0 677 15 1 678 25 1 678 6 0
解决方案
方法一:分组后比较最大值
利用groupby按id分组,通过transform对每组的points判断是否等于组内最大值,再转成整数:
df['win'] = df.groupby('id')['points'].transform(lambda x: x == x.max()).astype(int)
方法二:分组排名法
通过rank给每组的points降序排名,排名第一的标记为1,其余为0:
df['win'] = (df.groupby('id')['points'].rank(ascending=False) == 1).astype(int)
对原有代码的说明
你之前尝试的代码只能筛选出分数有上升的id,无法直接生成每行对应的胜负标记。上面的两种方法可以直接对每行数据进行判断,高效生成目标列。
内容的提问来源于stack exchange,提问作者Josh Johnson
相关产品推荐
相关产品推荐

