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

