maxframe.dataframe.DataFrame.query#

DataFrame.query(expr, inplace=False, **kwargs)#

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

参数:
  • expr (str) -- 要计算的查询字符串。您可以通过在环境变量前加上'@'字符来引用它们,如``@a + b``。您可以通过用反引号包围包含空格或运算符的列名来引用它们。这样您也可以转义以数字开头或Python关键字的名称。基本上当它不是有效的Python标识符时。有关更多详细信息,请参见下面的备注。例如,如果您的某一列名为``a a``,并且您想将其与``b``相加,则查询应为```a a` + b``。

  • inplace (bool) -- 查询是应该就地修改数据还是返回修改后的副本。

  • **kwargs -- 有关:meth:`DataFrame.query`接受的关键字参数的完整详细信息,请参阅:func:`eval`的文档。

返回:

由提供的查询表达式产生的DataFrame。

返回类型:

DataFrame

参见

eval

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

DataFrame.eval

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

备注

此表达式的计算结果首先传递给:attr:DataFrame.loc,如果由于多维键(例如,DataFrame)而失败,则结果将传递给:meth:DataFrame.__getitem__

此方法使用顶级:func:`eval`函数来计算传递的查询。

:meth:`~pandas.DataFrame.query`方法默认使用稍作修改的Python语法。例如,``&``和``|``(按位)运算符具有其布尔对应物:keyword:`and`和:keyword:`or`的优先级。这在语法上是有效的Python,但语义不同。

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

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

有关更多详细信息和示例,请参阅:ref:`indexing <indexing.query>`中的``query``文档。

反引号引用的变量

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

在解析过程中,反引号引用字符串内的一些不允许的字符被替换为允许作为Python标识符的字符串。这些字符包括Python中的所有运算符、空格字符、问号、感叹号、美元符号和欧元符号。对于超出ASCII范围(U+0001..U+007F)的其他字符以及PEP 3131中未进一步指定的字符,查询解析器将引发错误。这排除了与空格字符不同的空白字符,但也包括井号(因为它用于注释)和反引号本身(反引号也不能被转义)。

在特殊情况下,围绕反引号的一对引号可能会使解析器混淆。例如,`it's` > `that's```将引发错误,因为它形成了一个带反引号的引用字符串('s > that'`)。

另请参阅Python关于词法分析的文档(https://docs.python.org/3/reference/lexical_analysis.html)以及:mod:`pandas.core.computation.parsing`中的源代码。

示例

>>> import maxframe.dataframe as md
>>> df = md.DataFrame({'A': range(1, 6),
...                    'B': range(10, 0, -2),
...                    'C C': range(10, 5, -1)})
>>> df.execute()
   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').execute()
   A  B  C C
4  5  2    6

前一个表达式等价于

>>> df[df.A > df.B].execute()
   A  B  C C
4  5  2    6

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

>>> df.query('B == `C C`').execute()
   A   B  C C
0  1  10   10

前一个表达式等价于

>>> df[df.B == df['C C']].execute()
   A   B  C C
0  1  10   10