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

如何将if条件判断与NaN检查结合?附Pandas示例

解决Pandas中判断行值为NaN(或字符串"NaN")的问题

首先,咱们先拆解你遇到的两个核心问题:一是混淆了字符串"NaN"和Pandas真正的缺失值NaN,二是用apply逐行遍历的方式效率太低(大数据集下会拖慢速度)。

1. 先优化你的示例代码逻辑

你的DataFrame里data2列的"NaN"是字符串类型,不是Pandas识别的原生缺失值(真正的NaN是numpy.nan或pandas.NA)。你的判断条件本身是能匹配到目标行的,但apply逐行处理不是Pandas的最优写法——咱们用向量化操作就能一行搞定,不用写自定义函数:

import pandas as pd
import numpy as np

# 你的原始DataFrame
df = pd.DataFrame(
    {'key': ['A', 'B', 'C', 'A', 'B', 'C'], 
     'data1': range(6), 
     'data2': ['A1', 'B1', 'NaN', 'A1', 'B1','NaN']}, 
    columns=['key', 'data1', 'data2']
)

# 用np.where实现你的逻辑,比apply高效得多
df['NewColumn'] = np.where(
    (df['key'] == 'C') & (df['data2'] == 'NaN'),
    df['data1'],
    1
)

运行后得到的结果和你用apply完全一致,但速度会快很多,尤其是当数据集有几万行以上时。

2. 如果是真正的缺失值(NaN),怎么正确判断?

如果你的data2列里是原生缺失值(比如导入数据时自动识别的NaN,而非字符串"NaN"),绝对不能用== NaN判断——因为NaN不等于任何值,包括它自己。这时候要用到Pandas专门的缺失值判断函数:

# 先把字符串"NaN"转换成原生缺失值(如果需要的话)
df['data2'] = pd.to_numeric(df['data2'], errors='coerce')

# 用isna()判断缺失值,这是Pandas的标准写法
df['NewColumn'] = np.where(
    (df['key'] == 'C') & df['data2'].isna(),
    df['data1'],
    1
)

这里pd.to_numeric(errors='coerce')会把无法转成数字的字符串(比如"NaN"、"abc")自动转换成原生NaN,再用isna()精准识别缺失行。

3. 为什么不推荐用apply?

apply本质是Python级别的逐行循环,而Pandas的向量化操作是基于底层C语言实现的,处理大数据集时,向量化的速度可能是apply的几十甚至上百倍。除非你的逻辑特别复杂(比如需要跨行计算),否则尽量优先用向量化操作。

最终验证结果

不管用哪种方式,NewColumn的结果应该是:

0    1
1    1
2    2
3    1
4    1
5    5
Name: NewColumn, dtype: int64

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:30:42