DataFrame.query(self, expr, inplace=False, **kwargs) [source]
使用布尔表达式查询DataFrame
的列。
参数: | expr: 要评估的查询字符串。 可以在环境中引用变量, 方法是在变量前加上'@'字符, 例如 。 可以通过在反引号中将空格或运算符括起来来引用它们。 这样,还可以转义以数字开头或Python关键字的名称。 基本上是无效的Python标识符。 有关更多详细信息,请参见注释。 例如,如果你的一列叫做 想把它和 0.25.0版中的新功能: 引入了反引号引号。 1.0.0版中的新增功能: 扩展了反引号引号的功能,不仅限于空格。 inplace: 查询是应该修改数据还是返回修改后的副本。 **kwargs 有关eval()接受的关键字参数的完整详细信息, 请参见文档DataFrame.query()。 |
返回值: | DataFrame 由提供的查询表达式产生的 |
Notes
DataFrame.query()
方法说明
在 Pandas 中,DataFrame.query()
方法允许使用类似 SQL 的表达式对数据进行筛选。该表达式的求值结果首先会传递给 DataFrame.loc
,如果因多维键(如一个 DataFrame
对象)导致失败,则会退而调用 DataFrame.__getitem__()
方法。
query()
方法内部使用顶层的 eval()
函数来评估传入的表达式。
默认情况下,query()
使用经过轻微调整的 Python 语法。例如,按位运算符 &
和 |
的优先级高于其布尔对应物 and
和 or
。这种语法在语法上属于合法的 Python 表达式,但语义上略有不同。
如果需要使用与原生 Python 相同的语义解析方式,可以通过设置参数 parser='python'
来强制按 Python 解析表达式。同样,通过设置 engine='python'
可以指定使用 Python 本身作为计算后端(而非默认的 numexpr
引擎),但不推荐这样做,因为效率较低。
在查询表达式的命名空间中,默认会引入当前 DataFrame
的 index
和 columns
,允许你像访问列一样使用它们。其中标识符 index
表示 DataFrame 的索引;你也可以通过索引的名称进行访问。请注意,Python 的保留关键字不能作为变量名使用。
更多信息与示例可参考 Pandas 文档中的 query
和索引部分的说明。
关于反引号引用变量
使用反引号(`
)包裹的变量在 query()
中会被当作字符串形式的 Python 表达式进行解析,并在内部转换为合法的 Python 标识符。然而,这种方式可能引发一些问题:
解析时,包含非法字符(如运算符、空格、问号、感叹号、美元符号、欧元符号等)的变量名会被替换为合法形式。
若包含非 ASCII 字符(不在
U+0001
到U+007F
范围内)且未被 PEP 3131 明确支持,解析器会抛出错误。某些特殊情况中,反引号与引号混用可能导致语法解析错误。如
df.query("`it's` > `that's`")
会被解析为错误的表达式
's > that'`
,从而触发异常。
例子
import pandas as pd df = pd.DataFrame({ 'age': [18, 22, 25, 30], 'score': [80, 90, 85, 88], 'gender': ['M', 'F', 'F', 'M'] }) # 查询 age > 20 且 gender 为 'F' result = df.query("age > 20 and gender == 'F'") print(result)
1)使用外部变量(使用 @
引用)
import pandas as pd df = pd.DataFrame({ 'age': [18, 22, 25, 30], 'score': [80, 90, 85, 88], 'gender': ['M', 'F', 'F', 'M'] }) threshold = 85 result = df.query("score > @threshold") print(result)
2)查询列名包含空格或特殊字符(需使用反引号 `
)
import pandas as pd df = pd.DataFrame({ 'age': [18, 22, 25, 30], 'score': [80, 90, 85, 88], 'gender': ['M', 'F', 'F', 'M'] }) df2 = pd.DataFrame({ 'product name': ['A', 'B', 'C'], 'price($)': [10, 20, 15] }) print(df2.query("`price($)` > 12"))