pandas.DataFrame.query#
- DataFrame.query(expr, *, inplace=False, **kwargs)[源代码][源代码]#
使用布尔表达式查询DataFrame的列。
这种方法可以运行任意代码,如果你将用户输入传递给这个函数,可能会使你容易受到代码注入的攻击。
- 参数:
- exprstr
要评估的查询字符串。
你可以通过在变量前加上 ‘@’ 字符来引用环境中的变量,例如
@a + b
。你可以通过用反引号包围它们来引用不是有效 Python 变量名的列名。因此,包含空格或标点符号(除了下划线)或以数字开头的列名必须用反引号包围。(例如,名为 “Area (cm^2)” 的列应引用为
`Area (cm^2)`
)。作为 Python 关键字的列名(如 “if”、”for”、”import” 等)不能使用。例如,如果你的一个列被称为
a a
,并且你想将其与b
相加,你的查询应该是`a a` + b
。- inplacebool
是否修改 DataFrame 而不是创建一个新的。
- **kwargs
请参阅
eval()
的文档,以获取关于DataFrame.query()
接受的键值参数的完整细节。
- 返回:
- DataFrame 或 None
由提供的查询表达式生成的 DataFrame,如果
inplace=True
则为 None。
参见
eval
评估一个描述对 DataFrame 列进行操作的字符串。
DataFrame.eval
评估一个描述对 DataFrame 列进行操作的字符串。
备注
这个表达式的计算结果首先传递给
DataFrame.loc
,如果因为多维键(例如,DataFrame)导致失败,那么结果将被传递给DataFrame.__getitem__()
。此方法使用顶层的
eval()
函数来评估传递的查询。query()
方法默认使用稍微修改过的 Python 语法。例如,&
和 ``|``(按位)运算符具有与其布尔表亲and
和or
相同的优先级。这在语法上是有效的 Python,然而语义是不同的。你可以通过传递关键字参数
parser='python'
来改变表达式的语义。这强制了与在Python空间中求值相同的语义。同样地,你可以传递engine='python'
来使用Python本身作为后端来求值表达式。这不推荐,因为它与使用numexpr
作为引擎相比效率低下。在
DataFrame
实例的DataFrame.index
和DataFrame.columns
属性默认放置在查询命名空间中,这允许你将框架的索引和列都视为框架中的列。框架索引使用标识符index
;你也可以使用索引的名称在查询中识别它。请注意,Python 关键字不能用作标识符。欲了解更多详情和示例,请参阅 索引 中的
query
文档。反引号引用的变量
反引号引用的变量被解析为字面 Python 代码,并在内部转换为有效的 Python 标识符。这可能导致以下问题。
在解析过程中,反引号引用字符串中的许多不允许字符被替换为允许作为Python标识符的字符串。这些字符包括Python中的所有运算符、空格字符、问号、感叹号、美元符号和欧元符号。
一个反引号可以通过双反引号进行转义。
另请参阅 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
使用局部变量:
>>> local_var = 2 >>> df.query("A <= @local_var") A B C&C 0 1 10 10 1 2 8 9