如何正确使用df.query()多条件查询?and/or与&/|的选择及最佳实践
Pandas
query方法中and/or与&/|的使用指南 问题梳理
在使用Pandas的query做多条件查询时,常会有这些困惑:
- 用
and/or或者&/|到底对不对? - 有没有必要同时混用两类运算符?
- 哪种写法更规范?
- 文档说“
&/|和and/or优先级相同”,到底是什么意思?
实际测试发现两种写法结果一致,示例代码如下:
import numpy as np import pandas as pd df = pd.DataFrame(data=np.random.randn(5,2), columns=['A','B']) df['names'] = list('ABCDE') # 布尔运算符写法 query1 = df.query("A > -1 and B < 1 or 'B' in names") # 位运算符写法 query2 = df.query("A > -1 & B < 1 | 'B' in names") # 输出为True,结果完全一致 print(query1.equals(query2))
解答
优先级相同的实际含义
在常规Python代码里,&/|的优先级比and/or高,比如a > 1 and b < 2 & c ==3会先计算b <2 & c==3;但在query的表达式里,这两类运算符的优先级是完全相同的——也就是说你示例里的两个表达式,运算顺序完全一致,所以结果没差别。两种写法都合法
在query中,and/or和&/|都是被支持的合法写法,只要逻辑没问题,都能得到正确结果。没必要同时混用两类运算符
两类运算符功能重叠,优先级又一致,混用只会让代码变难读,完全没有必要。日常开发中几乎碰不到需要同时用的场景。最佳实践建议
- 优先用
and/or:这类写法更贴近自然语言,复杂条件下可读性拉满,别人一看就懂你的查询逻辑。 - 复杂条件加括号:不管用哪种写法,多条件组合时最好用括号把逻辑分组,比如写成
(A > -1 and B < 1) or 'B' in names,哪怕优先级没问题,也能避免误解。 - 别把
query的习惯带到普通代码里:在query之外的Python代码中,&/|优先级更高,要是照搬query里的写法,很容易出逻辑错误。
内容的提问来源于stack exchange,提问作者Dudelstein
相关产品推荐
相关产品推荐

