pandas.DataFrame.query#

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

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

Parameters:
exprstr

要评估的查询字符串。

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

您可以通过将无效的 Python 变量名的列名括在反引号中来引用它们。因此,包含空格或标点符号(下划线除外)或以数字开头的列名必须括在反引号中。(例如,名为 “Area (cm^2)” 的列将被引用为 `Area (cm^2)`)。不能使用 Python 关键字(如 “list”, “for”, “import” 等)作为列名。

例如,如果您的其中一列名为 a a,并且您想将其与 b 相加,则您的查询应该是 `a a` + b

inplacebool

是修改 DataFrame 还是创建新的 DataFrame。

**kwargs

有关 eval() 接受的关键字参数的完整详细信息,请参阅 DataFrame.query() 的文档。

Returns:
DataFrame 或 None

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

参见

eval

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

DataFrame.eval

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

Notes

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

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

query() 方法默认使用稍作修改的 Python 语法。例如,&``|``(按位)运算符具有其布尔对应项 andor 的优先级。这在语法上是有效的 Python,但语义不同。

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

DataFrame.index 实例的 DataFrame.columnsDataFrame 属性默认放置在查询命名空间中,这允许您将 DataFrame 的索引和列都视为 DataFrame 中的列。标识符 index 用于 DataFrame 索引;您也可以使用索引的名称在查询中标识它。请注意,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 中的源代码。

Examples

>>> 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