2013-08-02 73 views
7

Có thể làm việc với gấu trúc DataFrame như với bảng tính Excel: giả sử, bằng cách nhập công thức trong cột sao cho khi các biến trong cột khác thay đổi, các giá trị trong cột này tự động thay đổi? Một cái gì đó như:Làm thế nào để lưu trữ công thức, thay vì giá trị, trong gấu trúc DataFrame

a b c 
2 3 =a+b 

Và vì vậy khi tôi cập nhật 2 hoặc 3, cột c cũng tự động cập nhật.

PS: Có thể viết một hàm để trả về a+b, nhưng có chức năng tích hợp nào trong gấu trúc hoặc trong các thư viện Python khác để làm việc với ma trận theo cách này không?

Trả lời

12

này sẽ làm việc trong 0.13 (vẫn còn trong phát triển)

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 

này sẽ có thể như 'a + b' (sớm)

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 

Bạn thể thực hiện một cái móc vào SetItem trên khung dữ liệu để có loại chức năng này được gọi là tự động. Nhưng khá phức tạp. Bạn không chỉ định cách khung được cập nhật ở vị trí đầu tiên. Có thể đơn giản nhất là gọi hàm cập nhật sau khi bạn thay đổi các giá trị

3

Hiện tại không có cách nào để thực hiện điều này một cách chính xác theo cách bạn mô tả.

Trong gấu trúc 0,13 sẽ có phương thức DataFrame.eval mới cho phép bạn đánh giá biểu thức trong "ngữ cảnh" của DataFrame. Ví dụ: bạn sẽ có thể df['c'] = df.eval('a + b').

+0

hiện các chuỗi trong các chức năng hỗ trợ eval, như, df [ 'c'] = df.eval ('a.diff() + b') ? – bigbug

+0

No. Lưu trữ kết quả của một cuộc gọi hàm trong một biến. –

+0

Có thể thêm hỗ trợ chức năng vào chuỗi trong phiên bản tiếp theo không? Mặc dù không mang lại bất kỳ nâng cấp hiệu suất nào. Đối với điều đó sẽ cho phép dataframe chấp nhận biểu thức đầu vào của người dùng và tính kết quả cho phù hợp. (giải pháp hiện tại của tôi là sử dụng pyparsing để phân tích và sửa đổi biểu thức, sau đó thực hiện nó, hơi xấu xí) – bigbug

5

Tôi không biết nó là những gì bạn muốn, nhưng tôi vô tình phát hiện ra rằng bạn có thể lưu trữ các đối tượng xlwt.Formula trong các ô DataFrame, và sau đó, sử dụng phương thức DataFrame.to_excel, xuất DataFrame thành excel và có công thức trong nó:

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

Hãy thử nó ...

+4

Nó không giống như OP muốn xuất một cái gì đó sang Excel. Bài đăng về bắt chước hành vi Excel bằng cách sử dụng DataFrame gấu trúc. – Artemix

+0

Mặc dù @jtornero trả lời một câu hỏi khác, anh ấy trả lời tôi, tôi rất biết ơn! – sferencik

Các vấn đề liên quan