为何DataFrame多条件筛选时首行未被识别?
问题原因分析与解决方案
这是个典型的运算符优先级坑,很多刚接触pandas布尔索引的同学都会栽在这里!
核心问题:运算符优先级搞反了
Python里的运算符优先级规则中,按位与运算符&的优先级要高于相等比较运算符==。你写的表达式(df['productCode']) == 23 & (df['basketID'] == 1),Python并不会按照你预期的「先分别判断两个条件,再做按位与」来执行,而是会先计算23 & (df['basketID'] == 1)这部分。
我们拆解一下错误的执行流程:
- 先计算
df['basketID'] == 1,得到布尔数组:[True, True, True, False, False, False, False, False] - 布尔值在Python中等价于整数(True=1,False=0),所以将这个数组和23做按位与运算:
23 & 1 = 1,23 & 0 = 0,最终得到数组[1,1,1,0,0,0,0,0] - 最后判断
df['productCode'] == 上述数组——你的productCode都是23、24、25,自然全不匹配,结果就全是False了。
正确写法
你需要给每个独立的比较条件都加上括号,明确告诉Python先执行每个判断,再做按位与:
(df['productCode'] == 23) & (df['basketID'] == 1)
执行这个表达式的流程就是你预期的:
- 先得到
df['productCode'] ==23的布尔数组:[True,False,False,True,True,False,False,False] - 再得到
df['basketID'] ==1的布尔数组:[True,True,True,False,False,False,False,False] - 对两个数组做按位与,最终得到正确结果:
[True,False,False,False,False,False,False,False]
更直观的替代方案
如果觉得括号太多麻烦,也可以用pandas的query()方法,它的逻辑判断优先级和日常理解一致,写法更简洁:
df.query("productCode == 23 and basketID == 1")
内容的提问来源于stack exchange,提问作者Richard Rublev
相关产品推荐
相关产品推荐

