2017-03-02 50 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