pandas DataFrame使用多if条件计算最终得分结果不符如何解决
问题核心原因
你代码中所有使用== np.nan、!= np.nan的空值判断逻辑全部错误。NaN是特殊浮点类型,任何值与NaN做相等/不等比较都会返回False,哪怕np.nan == np.nan的结果也是False。因此只有两个分数都非空时你的条件能匹配成功,其余场景所有条件都不触发,函数无返回值,转成pandas列后就变为NaN,这就是第一、三行结果不符合预期的原因。
修正方案
方式1:修改你原有的apply逻辑
使用pandas内置的pd.isna()/pd.notna()做空值判断:
import numpy as np import pandas as pd df = pd.DataFrame({ 'score_1': [1.11, 2.22, np.nan, np.nan], 'score_2': [np.nan, 3.33, 3.33, np.nan] }) def final_score(row): s1_valid = pd.notna(row['score_1']) s2_valid = pd.notna(row['score_2']) if s1_valid and s2_valid: return row['score_1'] * 0.2 + row['score_2'] * 0.8 elif s1_valid: return row['score_1'] elif s2_valid: return row['score_2'] else: return np.nan df['final_score'] = df.apply(final_score, axis=1) print(df)
方式2:向量化实现(性能更高,推荐)
无需写循环和判断逻辑,直接利用fillna的特性实现规则:
# 先计算两个分数都有效时的加权结果 df['final_score'] = df['score_1'] * 0.2 + df['score_2'] * 0.8 # score_1为空时取score_2的值 df['final_score'] = df['final_score'].fillna(df['score_2']) # score_2为空时取score_1的值 df['final_score'] = df['final_score'].fillna(df['score_1'])
两种方式输出都和你的预期完全一致。
内容的提问来源于stack exchange,提问作者wawawa
相关产品推荐
相关产品推荐

