如何使用Pandas Dataframe列解析和评估数学表达式?

时间:2017-11-06 11:18:22

标签: python python-3.x pandas dataframe text-parsing

我想做的是解析这样一个表达式:

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)

所以,我的问题是:

  • 有没有python库可以做到这一点?如果没有,我怎样才能以简单的方式实现这一目标?
  • 创建递归函数可能是解决方案吗?
  • 如果我使用“反向抛光表示法”可以简化解析?
  • 我是否必须使用ast模块?

2 个答案:

答案 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也可能有更多受支持的操作