Pandas中括号对筛选器的影响?条件筛选报错及生效异常解析
问题根源:Python运算符优先级
你遇到的所有问题都是运算符优先级导致的——在Python里,按位与运算符&的优先级比比较运算符==、算术运算符%更高,代码的执行顺序和你预期的完全不一样。
第一次错误的代码分析
你最初写的代码:
filt = df["Hobbyist"] == "Yes" & df["Respondent"] % 2 == 0
按照优先级规则,Python会先执行"Yes" & df["Respondent"]——字符串和整数数组无法进行按位与运算,直接抛出TypeError,编辑器也会高亮"Yes"提示异常。
只给第一个条件加括号后的问题
当你给第一个条件加括号:
filt = (df["Hobbyist"] == "Yes") & df["Respondent"] % 2 == 0
Python的执行顺序变成了这样:
- 先计算括号内的
df["Hobbyist"] == "Yes",得到布尔数组X(True表示爱好编码,False表示不爱好) - 再执行算术运算
df["Respondent"] % 2,得到整数数组Y(0表示偶数ID,1表示奇数ID) - 按优先级执行
X & Y:布尔值会自动转为整数(True→1,False→0),按位与后得到整数数组Z(仅当X为True且Y为1时,Z为1,其余情况都是0) - 最后执行
Z == 0,得到布尔数组W
此时W为True的情况是:
- 当
Y为0(ID偶数)时,不管X是True还是False,X & 0结果都是0,0 == 0为True→所有偶数ID的行都会被保留 - 当
Y为1(ID奇数)时,只有X为False(不爱好编码)时,0 & 1结果是0,0 ==0为True→奇数ID且不爱好编码的行也会被保留
你觉得“仅Respondent的筛选生效”,大概率是因为数据里爱好编码的行占多数,奇数ID且不爱好编码的行很少,让你误以为只有偶数ID的条件在起作用。
正确写法的逻辑
只有给两个条件都加上括号,才能让Python先分别计算两个布尔条件,再执行按位与:
filt = (df["Hobbyist"] == "Yes") & (df["Respondent"] % 2 == 0)
这里的执行顺序是:
- 先计算
(df["Hobbyist"] == "Yes")得到布尔数组X - 再计算
(df["Respondent"] % 2 == 0)得到布尔数组Y - 最后执行
X & Y,只有两个数组对应位置都为True的行才会被筛选出来,也就是你需要的“爱好编码且ID为偶数”的行。
内容的提问来源于stack exchange,提问作者Daniel Aparisi
相关产品推荐
相关产品推荐

