Pandas中逻辑与运算异常排查及正确实现方法咨询
Pandas布尔列条件判断:运算符优先级踩坑与正确实现
这是一个典型的运算符优先级踩坑问题,你的两个条件表达式看起来逻辑一致,但因为Python的运算顺序规则,实际执行逻辑和你预期的完全不同,咱们一步步拆解:
问题根源:运算符优先级顺序
在Python中,&(按位与)的优先级高于>(比较运算符),所以你的两行代码都会被按照错误的顺序执行:
1. 关于cond1的执行逻辑
你写的代码:
cities['cond1'] = cities['City name'].str.contains('San') & cities['Area square miles'] > 50
实际执行顺序是:
- 先计算
cities['City name'].str.contains('San') & cities['Area square miles']:这里是把布尔类型的Series和数值类型的Series做按位与运算,得到的是一个数值型Series - 再将这个数值Series和50做
>比较,最终得到的布尔结果自然和你要的「城市名含San 且 面积>50」完全不符
2. 关于cond2的执行逻辑
你写的代码:
cities['cond2'] = cities['Area square miles'] > 50 & cities['City name'].str.contains('San')
实际执行顺序是:
- 先计算
50 & cities['City name'].str.contains('San'):Python会把布尔值True/False等价为1/0,和整数50做按位与运算。因为50的二进制最后一位是0,所以不管和1还是0运算,结果都是0 - 再计算
cities['Area square miles'] > 0:你的三个城市面积都大于0,所以全部返回True,这就是为什么cond2全为True的原因
正确实现方法
解决方法很简单:给每个独立的条件加上括号,强制Python先执行每个比较判断,再进行逻辑与运算:
# 正确的条件表达式,每个条件单独加括号 cities['correct_cond'] = (cities['City name'].str.contains('San')) & (cities['Area square miles'] > 50)
验证正确结果
执行上述代码后,得到的结果会符合你的预期:
City name Population Area square miles cond1 cond2 correct_cond 0 San Francisco 852469 46.87 False True False 1 San Jose 1015785 176.53 False True True 2 Sacramento 485199 97.92 False True False
- San Francisco:含San但面积<50 → False
- San Jose:含San且面积>50 → True
- Sacramento:不含San → False
内容的提问来源于stack exchange,提问作者prachi singh
相关产品推荐
相关产品推荐

