Top-level evaluation
方法 | 描述 |
---|---|
eval(expr[, parser, engine, local_dict, …]) | 用于在传入的字符串形式的表达式上进行高效计算的函数 |
pandas.eval()
pandas.eval()
是 Pandas 库中用于高效计算表达式的函数。它利用 NumExpr 库(如果已安装)来加速算术运算,并且可以直接操作 Pandas 的 DataFrame 和 Series 对象。下面是对 pandas.eval()
函数每个参数的详细介绍,以及示例和结果。
def eval(
expr: str | BinOp, # we leave BinOp out of the docstr bc it isn't for users
parser: str = "pandas",
engine: str | None = None,
local_dict=None,
global_dict=None,
resolvers=(),
level: int = 0,
target=None,
inplace: bool = False,
):
...
参数介绍
-
expr : str
- 要计算的字符串表达式。
- 可以包含变量名(这些变量名应该是 DataFrame 的列名或已经定义的变量)、算术运算符、比较运算符、逻辑运算符等。
-
parser : str {‘pandas’, ‘python’}, default ‘pandas’
- 指定用于解析表达式的解析器。
- ‘pandas’:使用 Pandas 的自定义解析器,它支持对 DataFrame 和 Series 的直接引用,并且可以利用 NumExpr 加速。
- ‘python’:使用 Python 的标准
eval()
函数进行解析,它不支持对 DataFrame 和 Series 的直接引用,并且不会利用 NumExpr 加速。
-
engine : str or None, default ‘numexpr’
- 指定用于计算表达式的引擎。
- ‘numexpr’:使用 NumExpr 库进行计算,如果已安装并且表达式适用。
- ‘python’:使用 Python 的标准运算符进行计算。
- 如果未安装 NumExpr,则默认使用 ‘python’。
-
local_dict : dict or None, default None
- 一个字典,用于指定表达式中变量的本地作用域。
- 如果提供了此参数,则表达式中的变量将首先在此字典中查找。
-
global_dict : dict or None, default None
- 一个字典,用于指定表达式中变量的全局作用域。
- 如果提供了此参数,并且变量在
local_dict
中未找到,则将在global_dict
中查找。
-
resolvers : list of dict-like or None, default None
- 一个字典列表,每个字典都定义了一个变量的作用域。
- 这些字典将按顺序搜索,直到找到所需的变量。
- 这可以用于更复杂的变量解析场景。
-
level : int or level name, default 0
- 如果
expr
涉及对 MultiIndex/Advanced Indexing 的引用,则此参数指定要操作的级别。
- 如果
-
target : object, default None
- 如果提供,则计算结果将直接存储在此对象中,而不是返回为一个新的对象。
- 这可以用于原地修改 DataFrame 或 Series。
-
inplace : bool, default False
- 如果为 True,并且提供了
target
参数,则直接在target
上进行修改,不返回任何值。
- 如果为 True,并且提供了
示例 1:基本算术运算
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
result = pd.eval('df.A + df.B', local_dict=locals())
print(result)
结果:
0 5
1 7
2 9
dtype: int64
注意:在这个例子中,我们使用了 locals()
来传递当前的局部变量环境给 pd.eval()
,这样它就可以识别到 df
中的列 A
和 B
。然而,更常见的做法是直接引用 DataFrame 的列名,如下所示:
result = pd.eval('df["A"] + df["B"]')
print(result)
这将得到相同的结果。
示例 2:使用变量和比较运算
x = 10
df = pd.DataFrame({'A': [1, 2, 3, 10, 11], 'B': [4, 5, 6, 7, 8]})
result = pd.eval('A > x', locals={'A': df['A'], 'x': x})
print(result)
结果:
0 False
1 False
2 False
3 True
4 True
dtype: bool
在这个例子中,我们直接在 pd.eval()
中使用了字典来指定 A
和 x
的值。
示例 3:原地修改 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
pd.eval('C = df.A + df.B', inplace=True, target=df)
print(df)
结果:
A B C
0 1 4 5
1 2 5 7
2 3 6 9
在这个例子中,我们直接在 df
上添加了一个新列 C
,它是 A
和 B
列的和。注意,这里我们使用了 inplace=True
和 target=df
参数来原地修改 df
。
请注意,pandas.eval()
是一个强大的工具,但应该谨慎使用,特别是在处理不受信任的输入时,因为它可以执行任意的 Python 代码。