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。
- 返回类型:
参见
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