Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。本文主要介绍一下Pandas中pandas.DataFrame.query方法的使用。

DataFrame.query(self, expr, inplace=False, **kwargs)     [source]

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

参数:

exprstr

要评估的查询字符串。

您可以在环境中引用变量,

方法是在变量前加上'@'字符,

例如 。@a + b

您可以通过在反引号中将空格或运算符括起来来引用它们。

这样,您还可以转义以数字开头或Python关键字的名称。

基本上是无效的Python标识符。

有关更多详细信息,请参见注释。

例如,如果你的一列叫做a a

你想把它和b相加,你的查询应该是' a a ' + b

0.25.0版中的新功能:

引入了反引号引号。

1.0.0版中的新增功能:

扩展了反引号引号的功能,不仅限于空格。

inplacebool

查询是应该修改数据还是返回修改后的副本。

**kwargs

有关eval()接受的关键字参数的完整详细信息,

请参见文档DataFrame.query()

返回值:

DataFrame

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

Notes

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

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

query()默认情况下,该方法使用经过稍微修改的Python语法。例如,&和| (按位)运算符具有其布尔表亲and和的优先级 or。这在语法上是有效的Python,但是语义不同。

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

默认情况下,实例的DataFrame.index和 DataFrame.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

例子

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