You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Pandas中基于多列计算新列并实现特殊条件加分逻辑

Pandas中基于多列计算新列并实现特殊条件加分逻辑

嗨,我来帮你搞定这个需求~ 我们可以分两步来实现:先计算基础的TournamentPoints,再给符合条件的行加上50分奖励。下面是具体的实现方案:

第一步:计算基础的TournamentPoints

首先按照你给出的公式计算初始的TournamentPoints,这里假设你已经得到了number_of_playersx的具体值(比如示例数据里共有5个玩家,我们先假设x=2,你可以替换成实际计算出来的值):

import pandas as pd

# 假设你的DataFrame已经构造完成,名为df
number_of_players = len(df)  # 或者你预先计算好的数值
x = 2  # 替换为实际的x值

# 计算初始TournamentPoints
df['TournamentPoints'] = ((number_of_players / 10) * (df["VP"] + 1)) + (df['GW'] * x)

第二步:给符合条件的行加50分奖励

接下来我们要找到Final列数值最高的行,如果有多个行共享这个最高值,就选其中Pos最小的那一行,给它的TournamentPoints加50:

# 找到Final列的最大值
max_final = df['Final'].max()

# 筛选出所有Final等于最大值的行,按Pos升序排序后取第一行的索引
target_idx = df[df['Final'] == max_final].sort_values('Pos').index[0]

# 给目标行的TournamentPoints追加50分
df.loc[target_idx, 'TournamentPoints'] += 50

逻辑说明

  • 第一步完全遵循你给出的公式计算基础积分,和你原本的思路一致;
  • 第二步先锁定Final的最高值,再通过筛选+排序的方式精准定位到优先级最高(Pos最小)的目标行,最后用loc直接修改对应位置的数值,比applymap更直观可靠;
  • 这个方案同时覆盖了两种场景:单一行拥有最高Final、多行共享最高Final但Pos不同的情况,完美匹配你的要求。

之前用applymap没成功的话,可能是因为没有精准定位到目标行,这种先找索引再赋值的方式会更简单直接哦~

备注:内容来源于stack exchange,提问作者Simone Parmeggiani

火山引擎 最新活动