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’`` 解析器允许使用 andornot ,其语义与相应的按位运算符相同。 SeriesDataFrame 对象得到支持,其行为与普通 Python 求值相同。

Parameters:
exprstr

要计算的表达式。此字符串不能包含任何 Python statements ,只能包含 Python expressions

parser{‘pandas’, ‘python’},默认为 ‘pandas’

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

engine{‘python’, ‘numexpr’},默认为 ‘numexpr’

用于计算表达式的引擎。支持的引擎有:

  • None:尝试使用``numexpr``,回退到``python``

  • 'numexpr':“numexpr” 是默认引擎,它使用 numexpr 来计算 pandas 对象,在处理包含大型帧的复杂表达式时可大大提高速度。

  • 'python':执行操作,就像在顶层 Python 中使用了 eval 一样。此引擎通常不太有用。

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

local_dictdict 或 None,可选

本地变量的字典,默认情况下取自 locals()。

global_dictdict 或 None,可选

全局变量的字典,默认情况下取自 globals()。

resolversdict-like 或 None 的列表,可选

实现 __getitem__ 特殊方法的对象的列表,可用于注入额外的命名空间集合以进行变量查找。例如,这在 query() 方法中用于注入引用相应 DataFrame 实例属性的 DataFrame.indexDataFrame.columns 变量。

levelint, optional

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

targetobject, optional, default None

这是赋值的目标对象。当表达式中存在变量赋值时,会使用此对象。如果存在赋值,则 target 必须支持带有字符串键的项赋值,并且如果要返回副本,还必须支持 .copy()

inplacebool,默认 False

如果提供了 target 并且表达式修改了 target,是否原地修改 target。否则,返回修改后的 target 的副本。

Returns:
ndarray, numeric scalar, DataFrame, Series, or None

求值给定代码的完成值,如果 inplace=True 则为 None。

Raises:
ValueError

在许多情况下,可能会引发此类错误:

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

  • 表达式是多行的,但并非所有行都具有项赋值。例如:

    a = b + 1 a + 2

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

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

  • 提供了项赋值,但 target 不支持字符串项赋值。

  • 提供了项赋值且 inplace=False,但 target 不支持 .copy() 方法

参见

DataFrame.query

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

DataFrame.eval

计算描述 DataFrame 列操作的字符串。

Notes

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

有关更多详细信息,请参阅 enhancing performance 文档。

Examples

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