我想将数据与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
答案 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