如何检查DataFrame列中所有非NaN值均大于0?
正确检查DataFrame列的方法
你遇到的问题有两个核心原因:
- 直接用
df[col] > 0时,NaN值会被判定为False,导致all()返回False触发断言; - 第二个写法存在运算符优先级错误,且直接用
== np.nan无法正确识别NaN(因为NaN不等于任何值,包括自身)。
正确写法一(最直观)
先移除NaN值,再检查剩余所有值是否大于0:
assert df[col].dropna().gt(0).all()
正确写法二(直接检查每个元素)
明确判断每个元素要么是NaN,要么大于0,注意给比较运算加括号保证优先级:
import pandas as pd assert ((df[col] > 0) | pd.isna(df[col])).all()
或者用numpy的isnan:
import numpy as np assert ((df[col] > 0) | np.isnan(df[col])).all()
错误原因详解
- 第一个断言:
df[col] > 0中,NaN与任何值比较都会返回False,所以只要列中有NaN,all()就会返回False,触发断言。 - 第二个断言:
|的优先级高于>,代码会被解析为df[col] > (0 | df[col] == np.nan),导致数值类型和布尔类型混合运算,引发TypeError;同时df[col] == np.nan永远返回False,无法识别NaN值。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

