如何在pandas DataFrame中存储公式而不是值

12

能否像使用Excel电子表格一样使用pandas DataFrame:比如在某一列中输入公式,当其他列中的变量发生变化时,该列中的值会自动改变?类似于:

a  b  c
2  3  =a+b

所以,当我更新第2或第3列时,c列也会自动更新。

PS:很明显可以编写一个函数来返回a+b,但是在pandas或其他Python库中是否有内置功能可以这样处理矩阵?


1
有关pd.eval()函数族的更多信息,其特性和用例,请访问使用pd.eval()在pandas中进行动态表达式评估 - cs95
3个回答

15

这将在0.13版中运作(目前仍在开发中)

In [19]: df = DataFrame(randn(10,2),columns=list('ab'))

In [20]: df
Out[20]: 
          a         b
0  0.958465  0.679193
1 -0.769077  0.497436
2  0.598059  0.457555
3  0.290926 -1.617927
4 -0.248910 -0.947835
5 -1.352096 -0.568631
6  0.009125  0.711511
7 -0.993082 -1.440405
8 -0.593704  0.352468
9  0.523332 -1.544849

这将很快成为可能,就像'a + b'一样。

In [21]: formulas = { 'c' : 'df.a + df.b' }

In [22]: def update(df,formulas):
               for k, v in formulas.items():
                  df[k] = pd.eval(v)


In [23]: update(df,formulas)

In [24]: df
Out[24]: 
          a         b         c
0  0.958465  0.679193  1.637658
1 -0.769077  0.497436 -0.271642
2  0.598059  0.457555  1.055614
3  0.290926 -1.617927 -1.327001
4 -0.248910 -0.947835 -1.196745
5 -1.352096 -0.568631 -1.920726
6  0.009125  0.711511  0.720636
7 -0.993082 -1.440405 -2.433487
8 -0.593704  0.352468 -0.241236
9  0.523332 -1.544849 -1.021517

可以 在数据框的 setitem 中实现一个钩子,以便自动调用此类型的函数。但是这相当棘手。您没有指定首先如何更新该帧。最简单的方法可能是在更改值后直接调用更新函数。


12

我不知道这是否符合你的要求,但我意外地发现你可以在DataFrame单元格中存储xlwt.Formula对象,并且使用DataFrame.to_excel方法将DataFrame导出到Excel中,并在其中使用公式:

import pandas
import xlwt

formulae=[]
formulae.append(xlwt.Formula('SUM(F1:F5)'))
formulae.append(xlwt.Formula('SUM(G1:G5)'))
formulae.append(xlwt.Formula('SUM(H1:I5)'))
formulae.append(xlwt.Formula('SUM(I1:I5)'))

df=pandas.DataFrame(formula)
df.to_excel('FormulaTest.xls')

试一下...


4
看起来原帖并不想将什么东西导出到Excel中,该帖子是关于使用pandas DataFrame模仿Excel行为的。 - Artemix
5
尽管@jtornero回答了不同的问题,但他回答了我的问题,我很感激! - sferencik

3

目前还没有精确地按照您所描述的方式进行操作的方法。

pandas 0.13版本中将会有一个新的DataFrame.eval方法,它允许您在DataFrame的“上下文”中评估表达式。例如,您可以这样做:df['c'] = df.eval('a + b')


eval函数中的字符串是否支持函数,例如df['c'] = df.eval('a.diff() + b')? - bigbug
将函数调用的结果存储在一个变量中。 - Phillip Cloud
下一个版本是否可以在字符串中添加函数支持,即使不带来任何性能升级。为此,将让数据框接受用户输入的表达式,并相应地计算结果。(我的当前解决方案是使用pyparsing解析和修改表达式,然后执行它,有点丑陋) - bigbug
也许吧。我担心允许任意函数调用可能存在安全问题。 - Phillip Cloud
即使Python提供了eval和exec,安全性取决于如何使用它。dataframe.eval仅支持算术运算太过有限。 - bigbug
它不仅支持算术运算,还支持Python表达式的相当全面的子集。请阅读文档 - Phillip Cloud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接