pandas.DataFrame.query#

DataFrame.query(expr, *, parser='pandas', engine=None, local_dict=None, global_dict=None, resolvers=None, level=0, inplace=False)[源代码]#

使用布尔表达式查询 DataFrame 的列。

警告

此方法可以运行任意代码,如果您将用户输入传递给此函数,可能会使您面临代码注入的风险。

参数:
exprstr

要评估的查询字符串。

有关查询字符串中支持的操作和函数的详细信息,请参阅 eval() 的文档。

有关在查询字符串中引用列名和变量的详细信息,请参阅 DataFrame.eval() 的文档。

parser{‘pandas’, ‘python’}, 默认 ‘pandas’

用于从表达式构造语法树的解析器。默认值 'pandas' 对代码的解析方式与标准 Python 略有不同。或者,您可以使用 'python' 解析器来解析表达式,以保留严格的 Python 语义。有关更多详细信息,请参阅 提高性能 文档。

engine{‘python’, ‘numexpr’}, 默认 ‘numexpr’

用于评估表达式的引擎。支持的引擎有:

  • None : 尝试使用 numexpr,然后回退到 python

  • 'numexpr' : 这个默认引擎使用 numexpr 对 pandas 对象进行评估,从而在处理大型 DataFrame 的复杂表达式时获得显著的速度提升。

  • 'python' : 操作的执行方式与在顶层 Python 中 eval 一样。这个引擎通常不太有用。

未来可能会提供更多后端。

local_dictdict 或 None,可选

本地变量的字典,默认情况下从 locals() 获取。

global_dictdict 或 None,可选

全局变量的字典,默认情况下从 globals() 获取。

resolversdict-like 对象列表或 None,可选

一个实现 __getitem__ 特殊方法的对象列表,您可以使用它来注入额外的命名空间集合以用于变量查找。例如,这在 query() 方法中用于注入 DataFrame.indexDataFrame.columns 变量,这些变量分别引用其 DataFrame 实例属性。

levelint, optional

要遍历并添加到当前作用域的先前堆栈帧的数量。大多数用户 **不需要** 更改此参数。

inplacebool

是否修改 DataFrame 而不是创建新 DataFrame。

返回:
DataFrame 或 None

由提供的查询表达式生成的 DataFrame,如果 inplace=True 则为 None。

另请参阅

eval

计算描述 DataFrame 列操作的字符串。

DataFrame.eval

计算描述 DataFrame 列操作的字符串。

注意

表达式的评估结果首先传递给 DataFrame.loc,如果由于多维键(例如 DataFrame)而失败,则结果将传递给 DataFrame.__getitem__()

此方法使用顶层 eval() 函数来评估传入的查询。

默认情况下,query() 方法使用略微修改的 Python 语法。例如,&|(按位)运算符的优先级与其布尔对应符 andor 相同。这 **在语法上是有效的 Python**,但语义不同。

您可以通过传递关键字参数 parser='python' 来更改表达式的语义。这会强制执行与 Python 空间中评估相同的语义。同样,您可以传递 engine='python' 使用 Python 本身作为后端来评估表达式。不建议这样做,因为它比使用 numexpr 作为引擎效率低下。

默认情况下,DataFrame 实例的 DataFrame.indexDataFrame.columns 属性会放置在查询命名空间中,这允许您将框架的索引和列都视为框架中的一个列。标识符 index 用于框架索引;您也可以使用索引的名称在查询中标识它。请注意,Python 关键字不能用作标识符。

有关更多详细信息和示例,请参阅 索引query 的文档。

反引号引用的变量

反引号引用的变量将被解析为文字 Python 代码,并在内部转换为有效的 Python 标识符。这可能导致以下问题。

在解析过程中,反引号字符串中的许多不允许的字符将被替换为允许作为 Python 标识符的字符串。这些字符包括 Python 中的所有运算符、空格字符、问号、感叹号、美元符号和欧元符号。

反引号可以通过双反引号来转义。

另请参阅 Python 关于词法分析的文档,以及 pandas.core.computation.parsing 中的源代码。

示例

>>> df = pd.DataFrame(
...     {"A": range(1, 6), "B": range(10, 0, -2), "C&C": range(10, 5, -1)}
... )
>>> df
   A   B  C&C
0  1  10   10
1  2   8    9
2  3   6    8
3  4   4    7
4  5   2    6
>>> df.query("A > B")
   A  B  C&C
4  5  2    6

前面的表达式等同于

>>> df[df.A > df.B]
   A  B  C&C
4  5  2    6

对于名称中包含空格的列,可以使用反引号引用。

>>> df.query("B == `C&C`")
   A   B  C&C
0  1  10   10

前面的表达式等同于

>>> df[df.B == df["C&C"]]
   A   B  C&C
0  1  10   10

使用本地变量

>>> local_var = 2
>>> df.query("A <= @local_var")
A   B  C&C
0  1  10   10
1  2   8    9