在“pd.eval”或“df.eval”中公开内置(例如“str”)

Expose built-ins (e.g. `str`) in `pd.eval` or `df.eval`

提问人:mihovg93 提问时间:11/14/2023 更新时间:11/14/2023 访问量:43

问:

默认情况下,pandas 的 (both 和 ) 捕获并将它们作为表达式中的名称(如果以 . 为前缀)提供但是,内置项(如 )两者都不在。我怎样才能公开它们,使它们在表达式中可用(我猜也是)?表达式是(受信任的)用户提供的,所以我不能只添加我需要的内置组件。evalpd.evaldf.evallocals()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 definedstrglobals()

Python Pandas 数据帧 评估

评论


答:

0赞 Timeless 11/14/2023 #1

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

评论

0赞 mihovg93 11/14/2023
谢谢。那你知道如何使用普通引号(制作字符串文字)吗?例如 不起作用。它失败,并显示: 。df.eval("a.astype('str') + '_blabla'", engine="python")TypeError: unsupported operand type(s) for +: 'object' and '<class 'str'>'
0赞 Timeless 11/14/2023
怎么样?df.eval("a.astype('str').add('_blabla')", engine="python")
0赞 mihovg93 11/14/2023
发现有人遇到同样的问题,但似乎没有得到解决,哈哈:github.com/pandas-dev/pandas/issues/47734
1赞 mihovg93 11/14/2023
您的建议可以作为一种解决方法。