mars.dataframe.DataFrame.query#

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

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

Parameters
  • expr (str) –

    要评估的查询字符串。

    您可以通过在变量前加上 ' @ ' 字符来引用环境中的变量,就像 @a + b 一样。

    您可以通过用反引号将包含空格或运算符的列名括起来来引用它们。这样您也可以转义以数字开头的名称,或那些是 Python 关键字的名称。基本上,当它不是有效的 Python 标识符时。有关更多详细信息,请参阅下面的说明。

    例如,如果其中一列名为 a a 并且您想与 b 进行求和,则您的查询应为 `a a` + b

  • inplace (bool) – 查询是否应该就地修改数据或返回一个修改过的副本。

  • **kwargs – 请查看eval()的文档以获取关于DataFrame.query()接受的关键字参数的完整细节。

Returns

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

Return type

数据框

另请参阅

eval

评估描述对DataFrame列进行操作的字符串。

DataFrame.eval

评估描述对DataFrame列进行操作的字符串。

备注

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

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

query() 方法默认使用略微修改的 Python 语法。例如,&|(位运算)运算符的优先级与它们的布尔对应物 andor 相同。这 语法上有效的 Python,然而语义是不同的。

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

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

有关更多详细信息和示例,请参见indexing中的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) 与pandas.core.computation.parsing中的源代码结合使用。

示例

>>> import mars.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