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

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_1a_2result
gssfwegssfwe0
0
fsfsfw1
qweweqw2
adsadgsgdwwuwquq3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 03:18:27