Pandas比较含NaN/<NA>值的两列时结果错误如何解决
问题根因
np.isnan()仅支持数值类型的NaN判断,无法识别字符串列、Nullable类型列中的<NA>/pd.NA/None等空值,遇到非数值类型会直接抛错,迫使你写冗余的try/except分支,大幅提升逻辑出错概率。- 原逐行判断逻辑没有优先完成空值校验,当任意一列为空值时,两列值的
==/!=比较会返回pd.NA而非布尔值,多条件与运算时会出现非预期的真值判定,跳过前面的空值分支直接落到返回3的逻辑。 - 逐行
apply本身属于pandas低效操作,数据量较大时运行速度会明显变慢。
正确实现方案
统一使用pandas内置的isna()/notna()做全类型空值判断(可兼容所有空值类型:np.nan/pd.NA/None/<NA>),采用向量化操作替代逐行循环,按优先级先判断空值场景,再判断非空值的相等/不等关系,不需要写异常捕获逻辑:
import pandas as pd # 初始化结果列,默认值为0(覆盖两值相等、双空两个场景) df['result'] = 0 # a1非空、a2为空 → 赋值1 df.loc[(df['a_1'].notna()) & (df['a_2'].isna()), 'result'] = 1 # a1为空、a2非空 → 赋值2 df.loc[(df['a_1'].isna()) & (df['a_2'].notna()), 'result'] = 2 # 两列均非空且值不等 → 赋值3 df.loc[(df['a_1'].notna()) & (df['a_2'].notna()) & (df['a_1'] != df['a_2']), 'result'] = 3
注:你最开始描述的规则1和给出的预期结果表逻辑相反,上述代码完全匹配你给出的预期输出规则,如果需要调整场景对应值直接修改赋值即可。
运行结果验证
执行代码后输出完全符合预期:
| a_1 | a_2 | result |
|---|---|---|
| gssfwe | gssfwe | 0 |
| 0 | ||
| fsfsfw | 1 | |
| qweweqw | 2 | |
| adsadgsgd | wwuwquq | 3 |
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

