我想做的是解析这样一个表达式:
result = A + B + sqrt(B + 4)
其中A和B是数据帧的列。所以我必须解析这样的表达式才能得到结果:
new_col = df.B + 4
result = df.A + df.B + new_col.apply(sqrt)
df
是数据框。
我尝试过使用re.sub
,但最好只更换列变量(不是函数),如下所示:
import re
def repl(match):
inner_word = match.group(1)
new_var = "df['{}']".format(inner_word)
return new_var
eq = 'A + 3 / B'
new_eq = re.sub('([a-zA-Z_]+)', repl, eq)
result = eval(new_eq)
所以,我的问题是:
ast
模块?答案 0 :(得分:7)
Pandas DataFrames有一个eval
功能。使用您的示例等式:
{{1}}
答案 1 :(得分:1)
按照@uuazed提供的示例,更快的方法是使用numexpr
import pandas as pd
import numpy as np
import numexpr as ne
df = pd.DataFrame(np.random.randn(int(1e6), 2), columns=['A', 'B'])
eq = "A + B + sqrt(B + 4)"
timeit df.eval(eq)
# 15.9 ms ± 177 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
timeit A=df.A; B=df.B; ne.evaluate(eq)
# 6.24 ms ± 396 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
numexpr也可能有更多受支持的操作