2013-08-02 28 views
7

È possibile lavorare con DataFrame di panda come con un foglio di calcolo di Excel: ad esempio, immettendo una formula in una colonna in modo che quando le variabili in altre colonne cambiano, i valori in questa colonna cambia automaticamente? Qualcosa di simile:Come memorizzare formule, anziché valori, in panda DataFrame

a b c 
2 3 =a+b 

E così quando aggiorno 2 o 3, la colonna c aggiorna anche automaticamente.

PS: È chiaramente possibile scrivere una funzione per restituire a+b, ma esiste una funzionalità integrata nei panda o in altre librerie Python per funzionare con le matrici in questo modo?

risposta

12

Ciò funzionerà a 0.13 (ancora in sviluppo)

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 

Questo sarà possibile in quanto 'a + b' (presto)

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 

È potrebbe attuare un gancio in setitem sulla frame dati per avere questo tipo di funzione chiamata automaticamente. Ma piuttosto difficile. Non hai specificato come il frame viene aggiornato in primo luogo. Probabilmente sarebbe più semplice chiamare semplicemente la funzione di aggiornamento dopo aver modificato i valori

3

Attualmente non c'è modo di farlo esattamente nel modo in cui descrivi.

In panda 0.13 ci sarà un nuovo metodo DataFrame.eval che consentirà di valutare un'espressione nel "contesto" di un DataFrame. Ad esempio, sarai in grado di df['c'] = df.eval('a + b').

+0

fa la stringa in funzioni di supporto eval, come, df [ 'c'] = df.eval ('a.diff() + b') ? – bigbug

+0

No. Memorizza il risultato di una chiamata di funzione in una variabile. –

+0

È possibile aggiungere il supporto di funzione nella stringa nella prossima versione? Anche se non portare alcun aggiornamento delle prestazioni. Perché ciò consentirà a dataframe di accettare l'espressione di input dell'utente e di calcolare il risultato di conseguenza. (la mia soluzione attuale è usare pyparsing per analizzare e modificare l'espressione, quindi eseguirla, un po 'brutta) – bigbug

5

Non so che è quello che vuoi, ma ho scoperto casualmente che è possibile memorizzare oggetti xlwt.Formula nelle celle DataFrame e quindi, utilizzando il metodo DataFrame.to_excel, esportare DataFrame in Excel e avere il tuo formule in esso:

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') 

Provalo ...

+4

Non sembra che l'OP volesse esportare qualcosa in Excel. Il post riguarda l'imitazione del comportamento di Excel utilizzando DataFrame panda. – Artemix

+0

Anche se @jtornero ha risposto a una domanda diversa, ha risposto alla mia, di cui sono grato! – sferencik