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"))