【问题标题】:Return DataFrame using ipywidgets Button使用 ipywidgets 按钮返回 DataFrame
【发布时间】:2017-07-22 14:52:52
【问题描述】:

我目前正在创建一个从 pandas 继承 DataFrame 的类。我有兴趣开发一种名为“new_filter”的方法,它可以更好地执行 DataFrame 命令:

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' 是来自 'Result' 类的一个对象。有什么解决办法吗?

【问题讨论】:

    标签: python python-3.x pandas ipython-notebook ipywidgets


    【解决方案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()
    

    您可以看到,每当您点击完成时,更新后的dataframe 就在test_2.data 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2017-01-19
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      相关资源
      最近更新 更多