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

pandas如何基于行筛选条件新增列,避免非匹配行被NaN覆盖

问题原因

你代码出现NaN覆盖的核心原因是:循环内每次都对整个Final_Score列做全量赋值,每次赋值仅当前匹配科目的行有计算结果,其余行自动填充为NaN,因此最后一次循环(对应Science科目)的结果会覆盖之前所有赋值,最终只剩偏好为Science的行有值。

解决方案

方案1:使用Pandas原生方法(更高效,无需循环)

直接用lookup方法批量提取每个学生对应偏好科目的分数,和当前分数求和即可:

import pandas as pd
new_data = [['tom', 31, 50, 30, 20, 'English'], ['nick', 30, 42, 23, 21, 'Math'], ['juli', 39, 14, 40, 38, 'Science']]
df = pd.DataFrame(new_data, columns = ['Name','Current_Score','English','Science','Math','Favourite_Subject'])

# 核心逻辑:按行匹配偏好科目对应的分数求和
df['Final_Score'] = df['Current_Score'] + df.lookup(df.index, df['Favourite_Subject'])

方案2:修改原有循环逻辑

如果要保留你原来的循环写法,仅需要把全列赋值改为仅修改匹配条件的行即可,避免覆盖其他行的已有结果:

for subj in df['Favourite_Subject'].unique():
    mask = (df['Favourite_Subject'] == subj)
    # 仅对匹配mask的行赋值,不影响其他行
    df.loc[mask, 'Final_Score'] = df[mask].apply(lambda row: row['Current_Score'] + row[subj], axis=1)

两种方案最终都可以得到你需要的正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:21:02