2017-03-02 48 views
1

我目前正在創建一個繼承熊貓DataFrame的類。我感興趣的是開發一個名爲「new_filter」的方法是一個數據幀命令的執行票友:使用ipywidgets返回數據幀按鈕

import pandas as pd 
from ipywidgets import widgets 
from IPython.display import display 
import numpy as np 

class Result(pd.DataFrame): 

@property 
def _constructor(self): 
    return Result 

def _filter_done(self, c): 
    self._column_name = self._filter_dd.value 
    self._expression = self._filter_txt.value 
    return self[eval('self.'+ self._column_name +' '+self._expression)] 

def new_filter(self): 
    self._filter_dd = widgets.Dropdown(options=list(self.columns), 
              description='Column:') 
    self._filter_txt = widgets.Text(description='Expr:') 
    self._filter_button = widgets.Button(description = 'Done') 
    self._filter_box = widgets.VBox([self._filter_dd, self._filter_txt, self._filter_button]) 
    display(self._filter_box) 
    self._filter_button.on_click(self._filter_done) 

創建對象等之後:

test = Result(np.random.randn(3,4), columns=['A','B','C','D']) #just an example 
test_2 = test.new_filter() 

然後,例如: Widget Output

我想要的是'test_2'是'結果'類中的一個對象。有沒有解決這個問題的方法?

回答

1

首先,您將不得不返回函數new_filter中的某些內容。其次,如果你想要修改同一個對象,我覺得有點困難。你可以做的一件事就是擁有一個可以在_filter_done中更新的特性。

這裏是你如何能做到這一個小例子:

import pandas as pd 
from ipywidgets import widgets 
from IPython.display import display 
import numpy as np 

class Result(pd.DataFrame): 
    @property 
    def _constructor(self): 
     return Result 

    def _filter_done(self, obj, c): 
     ## obj is the obejct to be modified. 
     ## Updating its data attribute to have the filtered data. 
     self._column_name = self._filter_dd.value 
     self._expression = self._filter_txt.value 
     obj.data = self[eval('self.'+ self._column_name +' '+self._expression)] 

    def new_filter(self): 
     self._filter_dd = widgets.Dropdown(options=list(self.columns), 
              description='Column:') 
     self._filter_txt = widgets.Text(description='Expr:') 
     self._filter_button = widgets.Button(description = 'Done') 
     self._filter_box = widgets.VBox([self._filter_dd, self._filter_txt, self._filter_button]) 
     display(self._filter_box) 

     result_obj = FilterResult() 
     self._filter_button.on_click(lambda arg: self._filter_done(result_obj, arg)) 
     return result_obj 

from traitlets import HasTraits 
from traittypes import DataFrame 

class FilterResult(HasTraits): 
    data = DataFrame() 

用上面的例子代碼在你的問題,即,

test = Result(np.random.randn(3,4), columns=['A', 'B', 'C','D']) #just an example 
test_2 = test.new_filter() 

你可以看到,每當你點擊完成後,更新的dataframetest_2.data