2013-08-02 6 views
7

パンダのDataFrameをExcelスプレッドシートと同じように扱うことはできますか?つまり、他の列の変数が変更されたときに、この列は自動的に変わりますか?ような何か:パンダに値の代わりに式を格納する方法DataFrame

a b c 
2 3 =a+b 

だから、私は2または3を更新し、列cも自動的に更新されます。

PS:これは明らかにa+bを返す関数を書くことは可能ですが、この方法で行列を扱うためのpandasや他のPythonライブラリの組み込み関数はありますか?

答えて

12

これは

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 

これは

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関数にフックを実装することができます(すぐに)'a + b'として可能になります(まだ開発中)0.13で動作しますデータフレームは、このタイプの機能を自動的に呼び出します。しかし、かなりトリッキーです。あなたは指定していませんどのようにフレームが最初に更新されます。おそらく、値を変更した後でupdate関数を呼び出すのが最も簡単なのでしょうか?

3

現在のところ、これを正確に記述する方法はありません。

パンダ0.13には、DataFrameの「コンテキスト」内の式を評価できる新しいDataFrame.evalメソッドがあります。たとえば、df['c'] = df.eval('a + b')になります。

+0

...それを試してみてはevalのサポート機能では、文字列など、DF [ 'C'] = df.eval( 'a.diff()+ B')を行います? – bigbug

+0

いいえ。関数呼び出しの結果を変数に格納します。 –

+0

次のバージョンで関数サポートを文字列に追加することはできますか?パフォーマンスの向上はありません。そのために、データフレームはユーザ入力式を受け入れ、それに応じて結果をcaculateします。 (私の現在の解決策は、式を解析して修正するためにpyparsingを使用していますが、やや醜いexecを実行しています) – bigbug

5

わかりませんが、私は誤ってxlwt.FormulaオブジェクトをDataFrameセルに格納してから、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

OPが何かをExcelにエクスポートしたかったように見えません。ポストは、pandas DataFrameを使用してExcelの動作を模倣することです。 – Artemix

+0

@ ttorneroは別の質問に答えましたが、彼は私に答えました。そのために感謝しています! – sferencik

関連する問題