首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ipywidgets按钮返回DataFrame

使用ipywidgets按钮返回DataFrame
EN

Stack Overflow用户
提问于 2017-03-03 02:15:14
回答 1查看 1.9K关注 0票数 1

我目前正在创建一个继承了pandas的DataFrame的类。我感兴趣的是开发一个名为'new_filter‘的方法,它是DataFrame命令的一种更花哨的执行方式:

代码语言:javascript
复制
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)

创建如下对象后:

代码语言:javascript
复制
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’类的对象。对此有什么解决方案吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-17 23:48:46

首先,您必须在函数new_filter中返回一些内容。其次,如果你想要修改相同的对象,我认为这有点难。您可以做的一件事是拥有一个具有可在_filter_done中更新的特征的对象。

下面是一个小例子,告诉你如何做到这一点:

代码语言:javascript
复制
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()

使用与问题中相同的示例代码,即,

代码语言:javascript
复制
test = Result(np.random.randn(3,4), columns=['A', 'B', 'C','D']) #just an example
test_2 = test.new_filter()

您可以看到,无论何时单击done,更新后的dataframe都在test_2.data中。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42562895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档