2017-03-02 23 views
1

現在、私はpandasからDataFrameを継承するクラスを作成しています。例えば、次にipywidgetsを使用してDataFrameを返すボタン

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

::のようなオブジェクトを作成した後

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) 

:私は、データフレームコマンドの実行手の込んだある「new_filter」と呼ばれる方法を開発することに興味 Widget Output

私が欲しいのは、 'test_2'は 'Result'クラスのオブジェクトであるということです。これには何か解決策はありますか?

答えて

1

まず、関数new_filterで何かを返さなければなりません。第二に、同じオブジェクトを変更したい場合は、少し難しいと思います。あなたができることの1つは、_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にあります。

関連する問題