pandas.DataFrame.query#
- DataFrame.query(expr, *, parser='pandas', engine=None, local_dict=None, global_dict=None, resolvers=None, level=0, inplace=False)[源代码]#
使用布尔表达式查询 DataFrame 的列。
警告
此方法可以运行任意代码,如果您将用户输入传递给此函数,可能会使您面临代码注入的风险。
- 参数:
- exprstr
要评估的查询字符串。
有关查询字符串中支持的操作和函数的详细信息,请参阅
eval()的文档。有关在查询字符串中引用列名和变量的详细信息,请参阅
DataFrame.eval()的文档。- parser{‘pandas’, ‘python’}, 默认 ‘pandas’
用于从表达式构造语法树的解析器。默认值
'pandas'对代码的解析方式与标准 Python 略有不同。或者,您可以使用'python'解析器来解析表达式,以保留严格的 Python 语义。有关更多详细信息,请参阅 提高性能 文档。- engine{‘python’, ‘numexpr’}, 默认 ‘numexpr’
用于评估表达式的引擎。支持的引擎有:
None : 尝试使用
numexpr,然后回退到python'numexpr': 这个默认引擎使用 numexpr 对 pandas 对象进行评估,从而在处理大型 DataFrame 的复杂表达式时获得显著的速度提升。'python': 操作的执行方式与在顶层 Python 中eval一样。这个引擎通常不太有用。
未来可能会提供更多后端。
- local_dictdict 或 None,可选
本地变量的字典,默认情况下从 locals() 获取。
- global_dictdict 或 None,可选
全局变量的字典,默认情况下从 globals() 获取。
- resolversdict-like 对象列表或 None,可选
一个实现
__getitem__特殊方法的对象列表,您可以使用它来注入额外的命名空间集合以用于变量查找。例如,这在query()方法中用于注入DataFrame.index和DataFrame.columns变量,这些变量分别引用其DataFrame实例属性。- levelint, optional
要遍历并添加到当前作用域的先前堆栈帧的数量。大多数用户 **不需要** 更改此参数。
- inplacebool
是否修改 DataFrame 而不是创建新 DataFrame。
- 返回:
- 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