Pandas中使用isnull与&运算符过滤多条件的疑问及用法咨询
问题解答
一、为什么两个表达式结果不同?
核心原因是Python中and和&的运算符优先级存在差异:
对于
1000.0 > 0 and (pd.notnull(float('nan'))):and的优先级低于比较运算符>,所以先计算1000.0 > 0,结果为True;- 再计算
pd.notnull(float('nan')),由于float('nan')是空值,返回False; - 最后执行
True and False,结果为False。
对于
1000.0 > 0 & (pd.notnull(float('nan'))):&(按位与运算符)的优先级高于比较运算符>,所以先计算0 & (pd.notnull(float('nan')));pd.notnull(float('nan'))返回False,在Python中False等价于整数0,所以0 & 0的结果是0;- 最后计算
1000.0 > 0,结果为True。
二、DataFrame过滤的正确写法
在pandas中使用&做条件过滤时,每个独立的条件都必须用括号括起来,避免因运算符优先级导致逻辑错误。
假设a和b是DataFrame的列,正确写法如下:
# 写法1:使用pd.notnull函数 df['output'] = df[(df['a'] > 100) & pd.notnull(df['b'])] # 写法2:推荐用Series自带的notnull方法,可读性更强 df['output'] = df[(df['a'] > 100) & df['b'].notnull()]
如果a和b是单独的Series变量,写法类似:
df['output'] = df[(a > 100) & pd.notnull(b)]
核心是把a > 100这类比较运算的结果用括号包裹,确保先完成比较,再和非空校验的结果执行按位与操作。
内容的提问来源于stack exchange,提问作者Ishank lakhmani
相关产品推荐
相关产品推荐

