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

