Pandas遍历Dataframe判断NaN出错,请求排查问题原因
问题排查:Pandas判断NaN值错误导致输出异常
我用pdf-link-checker生成了记录链接状态的report.csv文件,通过Pandas加载为DataFrame后,想要根据request_error列是否为NaN(表示链接可用)输出提示:可用时输出No actions required,否则输出Mandatory。但实际所有链接都可用,却全部输出Mandatory,用itertuples遍历也没解决问题,期望7条链接都输出No actions required。代码如下:
import pandas df = pandas.read_csv('report.csv', delimiter=';') for index, row in df.iterrows(): if row['request_error'] == 'NaN': print('No actions required') else: print('Mandatory')
问题原因与解决办法
核心原因
Pandas读取CSV时,空值会被解析为特殊的浮点型NaN值,而非字符串'NaN'。你用== 'NaN'做字符串匹配,永远不会命中条件,所以所有情况都进入else分支输出Mandatory。
解决方法
方法1:用Pandas的NaN判断函数修改循环条件
直接使用pd.isna()(或pd.isnull(),两者等效)判断该值是否为NaN:
import pandas df = pandas.read_csv('report.csv', delimiter=';') for index, row in df.iterrows(): if pandas.isna(row['request_error']): print('No actions required') else: print('Mandatory')
方法2:用矢量化操作替代循环(更高效)
Pandas推荐用矢量化操作替代逐行循环,性能更好,代码更简洁:
import pandas df = pandas.read_csv('report.csv', delimiter=';') # 生成状态列 df['status'] = df['request_error'].apply( lambda x: 'No actions required' if pandas.isna(x) else 'Mandatory' ) # 打印所有状态 print(df['status'].tolist())
内容的提问来源于stack exchange,提问作者Thomas Wales
相关产品推荐
相关产品推荐

