pandas.DataFrame.query#
- DataFrame.query(expr, inplace=False, **kwargs)[源代码]#
使用布尔表达式查询DataFrame的列。
- 参数
- expr应力
要计算的查询字符串。
您可以在环境中引用变量,方法是在变量前加上一个‘@’字符,如下所示
@a + b
。您可以通过用反引号将列名称括起来来引用不是有效的Python变量名的列名。因此,包含空格或标点符号(下划线除外)或以数字开头的列名必须用反号括起来。(例如,名为“Area(cm^2)”的列将被引用为
`Area (cm^2)
`)。不能使用作为Python关键字的列名(如“list”、“for”、“import”等)。例如,如果您的一个列被调用
a a
你想把它加起来b
,您的查询应该是`a a` + b
。0.25.0 新版功能: 引入了反引号引用。
1.0.0 新版功能: 扩展了反引号的功能,不只是空格。
- inplace布尔尔
查询是应该就地修改数据还是返回修改后的副本。
- **kwargs
请参阅的文档
eval()
有关接受的关键字参数的完整详细信息DataFrame.query()
。
- 退货
- DataFrame或无
由提供的查询表达式产生的DataFrame,或者如果
inplace=True
。
参见
eval
计算描述DataFrame列上的操作的字符串。
DataFrame.eval
计算描述DataFrame列上的操作的字符串。
注意事项
此表达式的求值结果首先传递给
DataFrame.loc
如果由于多维密钥(例如,DataFrame)而失败,则结果将被传递到DataFrame.__getitem__()
。此方法使用顶级
eval()
函数计算传递的查询。这个
query()
默认情况下,方法使用略微修改过的Python语法。例如,&
和|
(按位)运算符的优先级高于它们的布尔同类运算符,and
和or
。这 is 在语法上是有效的,但是语义是不同的。您可以通过传递关键字参数来更改表达式的语义
parser='python'
。这强制执行与在Python空间中求值相同的语义。同样,你也可以通过engine='python'
要使用Python本身作为后端来计算表达式。不建议这样做,因为与使用numexpr
作为引擎。这个
DataFrame.index
和DataFrame.columns
对象的属性DataFrame
实例默认放置在查询命名空间中,这使您可以将框架的索引和列都视为框架中的列。该识别符index
用于帧索引;您还可以使用索引的名称在查询中标识它。请注意,不能将Python关键字用作标识符。有关更多详细信息和示例,请参阅
query
中的文档 indexing 。反引号引用的变量
带反引号的变量被解析为字面形式的Python代码,并在内部转换为一个有效的Python标识符。这可能会导致以下问题。
在解析过程中,反引号带引号的字符串中的一些不允许的字符将被允许作为Python标识符的字符串替换。这些字符包括Python中的所有运算符、空格字符、问号、感叹号、美元符号和欧元符号。对于ASCII范围之外的其他字符(U+0001..U+007F)以及PEP 3131中未进一步指定的字符,查询解析器将引发错误。这不包括不同于空格字符的空格,但也不包括hashtag(因为它用于注释)和反标记本身(反标记也不能转义)。
在特殊情况下,反号前后的引号可能会使解析器感到困惑。例如,
`it's` > `that's
将引发错误,因为它形成了一个带引号的字符串 (`'s > that'` )内有反记号。另请参阅有关词法分析(https://docs.python.org/3/reference/lexical_analysis.html)的PYTHON文档以及
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