用python解析和评估arbirtary方程

时间:2017-04-12 14:42:05

标签: python pandas

我想将数据与python项目中的代码分开。数据由pandas DataFrames和链接DataFrame列的公式组成。

目前,我在我的脚本中对方程进行了硬编码,因此我无法动态更改它们(在运行时新的DataFrames和相应的方程式中加载)。关于如何生成等效函数的任何建议?

E.g:

#Given a pandas data frame:
import pandas as pd
df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]], columns= ["a", "b", "c"])

# and a simple arbitrary expression such as:
equation1 ="a + 2*a/b"

#how to dynamically create a function equivalent to:
def f(df):
  return(df['a']+2*df['a']/df['b']) # hard-coded equation 1

3 个答案:

答案 0 :(得分:5)

您可以使用DataFrame.eval

equation1 ="a + 2*a/b"
print (df.eval(equation1))
0    2.00
1    5.60
2    8.75
dtype: float64

答案 1 :(得分:4)

您可以使用assign

将其分配回数据框
df.assign(eq1=df.eval(equation1))

   a  b  c   eq1
0  1  2  3  2.00
1  4  5  6  5.60
2  7  8  9  8.75

使用方程式词典

可以使动态更加动态
deq = dict(
    EQ1='a + 2 * a / b',
    EQ2='c ** 2 / (a + b)'
)
df.assign(**{k: df.eval(v) for k, v in deq.items()})

   a  b  c   EQ1  EQ2
0  1  2  3  2.00  3.0
1  4  5  6  5.60  4.0
2  7  8  9  8.75  5.4

答案 2 :(得分:3)

又一个解决方案similar to @piRSquared's solution,它允许一步评估多个方程式:

In [442]: equations = """
     ...: EQ1 = a + 2 * a / b
     ...: EQ2 =c ** 2 / (a + b)
     ...: """

In [443]: df.eval(equations, inplace=False)
Out[443]:
   a  b  c   EQ1  EQ2
0  1  2  3  2.00  3.0
1  4  5  6  5.60  4.0
2  7  8  9  8.75  5.4

注意:使用多行表达式会更好 - 在这种情况下,您可以使用以前计算的变量

演示:

In [444]: equations = """
     ...: EQ1 = a + 2 * a / b
     ...: EQ2 = EQ1**2
     ...: """

In [445]: df.eval(equations, inplace=False)
Out[445]:
   a  b  c   EQ1      EQ2
0  1  2  3  2.00   4.0000
1  4  5  6  5.60  31.3600
2  7  8  9  8.75  76.5625