pandas.DataFrame.query#

DataFrame.query(expr, *, inplace=False, **kwargs)[源代码][源代码]#

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

这种方法可以运行任意代码,如果你将用户输入传递给这个函数,可能会使你容易受到代码注入的攻击。

参数:
exprstr

要评估的查询字符串。

你可以通过在变量前加上 ‘@’ 字符来引用环境中的变量,例如 @a + b

你可以通过用反引号包围它们来引用不是有效 Python 变量名的列名。因此,包含空格或标点符号(除了下划线)或以数字开头的列名必须用反引号包围。(例如,名为 “Area (cm^2)” 的列应引用为 `Area (cm^2)`)。作为 Python 关键字的列名(如 “if”、”for”、”import” 等)不能使用。

例如,如果你的一个列被称为 a a ,并且你想将其与 b 相加,你的查询应该是 `a a` + b

inplacebool

是否修改 DataFrame 而不是创建一个新的。

**kwargs

请参阅 eval() 的文档,以获取关于 DataFrame.query() 接受的键值参数的完整细节。

返回:
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