默认情况下,pandas 的
eval
(pd.eval
和 df.eval
)捕获 locals()
和 globals()
,并在表达式中将它们用作名称(如果前缀为 @
)。然而,内置函数,例如 str
,都不在其中。我怎样才能暴露它们,使它们在表达式中可用(我猜也可以使用 @
)?这些表达式是(受信任的)用户提供的,所以我不能只添加我需要的内置函数。
举一个具体的例子,我想运行如下所示的代码:
df = pd.DataFrame({'a' : [1, 2, 3, 4]})
res = df.eval('a.astype(@str)', engine='python')
目前,此操作失败:
pandas.core.computation.ops.UndefinedVariableError: local variable 'str' is not defined
。我当前的解决方法是在测试时手动将 str
添加到 globals()
。
IIUC,将类型放在引号之间
'str'
:
res = df.eval("a.astype('str')", engine="python")
输出:
print(type(res.iat[0])) # <class 'str'>
print(res)
0 1
1 2
2 3
3 4
Name: a, Length: 4, dtype: object