pandas.eval#

pandas.eval(expr, parser='pandas', engine=None, local_dict=None, global_dict=None, resolvers=(), level=0, target=None, inplace=False)[源代码][源代码]#

使用各种后端将Python表达式作为字符串进行评估。

支持以下算术运算:+, -, *, /, **, %, //``(仅限python引擎)以及以下布尔运算:``|``(或),``&``(与),和``~``(非)。此外,’pandas’``解析器允许使用:keyword:andor,和:keyword:not,其语义与相应的按位运算符相同。:class:`~pandas.Series`和:class:`~pandas.DataFrame`对象得到支持,并且其行为与普通的Python评估相同。

警告

eval 可以运行任意代码,这可能使你容易受到代码注入攻击。

注入和不受信任的数据。

参数:
exprstr

要评估的表达式。此字符串不能包含任何 Python 语句,只能包含 Python 表达式

解析器{‘pandas’, ‘python’}, 默认 ‘pandas’

用于从表达式构建语法树的解析器。默认的 'pandas' 解析代码与标准 Python 略有不同。或者,您可以使用 'python' 解析器来保留严格的 Python 语义。有关更多详细信息,请参阅 增强性能 文档。

引擎{‘python’, ‘numexpr’}, 默认 ‘numexpr’

用于评估表达式的引擎。支持的引擎有

  • None : 尝试使用 numexpr,如果失败则回退到 python

  • 'numexpr' : 这个默认引擎使用 numexpr 来评估 pandas 对象,以便在包含大帧的复杂表达式中实现大幅速度提升。

  • 'python' : 执行操作就像你在顶级python中 eval 一样。这个引擎通常不是那么有用。

未来可能会提供更多的后端。

local_dict字典或无,可选

一个局部变量的字典,默认从 locals() 获取。

global_dict字典或无,可选

一个全局变量的字典,默认从 globals() 获取。

解析器字典类列表或 None,可选

一个实现了 __getitem__ 特殊方法的对象列表,你可以使用它来注入一个额外的命名空间集合,用于变量查找。例如,这在 query() 方法中使用,以注入 DataFrame.indexDataFrame.columns 变量,这些变量引用它们各自的 DataFrame 实例属性。

级别int, 可选

要遍历并添加到当前作用域的先前堆栈帧的数量。大多数用户将**不**需要更改此参数。

目标对象,可选,默认无

这是赋值的目标对象。它在表达式中有变量赋值时使用。如果是这样,那么 target 必须支持使用字符串键进行项赋值,如果正在返回一个副本,它还必须支持 .copy()

inplace布尔值, 默认为 False

如果提供了 target,并且表达式改变了 target,是否就地修改 target。否则,返回带有突变的 target 的副本。

返回:
ndarray, 数值标量, DataFrame, Series, 或 None

如果 inplace=True,则评估给定代码的完成值或 None。

引发:
ValueError

有许多情况下可能会引发这样的错误:

  • target=None,但表达式是多行的。

  • 这个表达式是多行的,但并不是所有的都有项分配。这种排列的一个例子是这样的:

    a = b + 1 a + 2

    这里,有不同行的表达式,使其成为多行,但最后一行没有将 a + 2 的输出赋值给变量。

  • inplace=True,但表达式缺少项赋值。

  • 提供了项目分配,但 target 不支持字符串项目分配。

  • 提供了项目分配并且 inplace=False,但 target 不支持 .copy() 方法

参见

DataFrame.query

评估一个布尔表达式以查询帧的列。

DataFrame.eval

评估一个描述对 DataFrame 列进行操作的字符串。

注释

在算术 % 操作中涉及的任何对象的 dtype 都会递归地转换为 float64

有关更多详细信息,请参阅 增强性能 文档。

例子

>>> df = pd.DataFrame({"animal": ["dog", "pig"], "age": [10, 20]})
>>> df
  animal  age
0    dog   10
1    pig   20

我们可以使用 pd.eval 添加一个新列:

>>> pd.eval("double_age = df.age * 2", target=df)
  animal  age  double_age
0    dog   10          20
1    pig   20          40