我有大量变量可以在脚本中调用并由
pandas.eval()
进行评估。 这实际上是一个数学评估器。 但是,在执行之前,我们必须从多个数据源组装数据帧eval()
。 这意味着我需要解析我们给出的方程,执行搜索方法并找到命名变量,将它们合并到数据帧中,最后执行 eval()
方法。
我尝试使用正则表达式来执行此操作,这可能仍然是答案,但是当变量名称中包含空格时,一切都会陷入困境。 我是正则表达式新手。
然后我进入了
pandas.evel()
源代码:https://github.com/pandas-dev/pandas/blob/main/pandas/core/computation/expr.py尝试复制Pandas的方法正在使用,因为他们必须做同样的事情。 事实证明,他们对名称中的空格也没有一个好的答案(here和here)。
我仍然喜欢使用与 pandas 相同的解析的想法,因为这是最强大的解决方案。 Pandas 使用来自
Expr
的 pandas.core.computation.expr
(来源)。 但当我尝试使用该方法时,我遇到了各种错误。 我可以重建生成上下文的整个序列,并将在 pandas.eval() 中工作的相同字符串传递给它(这一行中的所有内容:Expr(simpeval, engine=engine, parser=parser, env=env)
),我得到 pandas.core.computation.ops.UndefinedVariableError: name 'var1' is not defined
。我不明白 pandas.eval()
在第 345 行上是如何做的并且没有收到此错误。
我想我只是需要更多的头脑来解决这个问题。 我正在尝试从字符串 eval 表达式中获取所有变量的列表(允许带有空格的列名称)。
理想的结果:
in
eval_string = "(var1 / var with spaces 2) + var with spaces 3"
parsed_vars = magic_of_stack_overflow(eval_String)
parsed_vars
out
["var1","var with spaces 2","var with spaces 3"]
理想的理想结果: 我可以做同样的事情,但是使用我将在 pandas 中传递表达式的确切解析器。
我会对其中任何一个感到兴奋。
编辑: 蟒蛇3.12 熊猫1.3.5
您可以使用正则表达式来识别以字母开头、没有运算符作为字符并以非空格有效字符结尾的字符串:
import re
eval_string = "(var1 / var with spaces 2) + var with spaces 3"
out = re.findall(r'[a-zA-Z][^()/+-]+[^()/\-+ ]', eval_string)
输出:
['var1', 'var with spaces 2', 'var with spaces 3']