在数据框上使用 ipywidgets SelectMultiple

using ipywidgets SelectMultiple on a dataframe

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

a = ['Banking', 'Auto', 'Life', 'Electric', 'Technology', 'Airlines', 
'Healthcare']
df = pd.DataFrame(np.random.randn(7, 4), columns = list('ABCD'))
df.index = a

df.head(7)


dropdown = widgets.SelectMultiple(
                        options=df.index,
                        description='Sector',
                        disabled=False,
                        layout={'height':'100px', 'width':'40%'})
display(dropdown)

我想创建一个可以按部门过滤 df 的函数。也就是说,我 select Airlines, Banking and Electric 从显示(下拉)和它 returns 仅 selected 部门的数据框。

尝试这样的事情,我在这种情况下使用了一个全局变量来演示,但我通常会将功能包装在 class 中,因此您始终可以访问过滤后的数据框。

我没有使用交互,而是在“选择”小部件上使用了 .observe

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

a = ['Banking', 'Auto', 'Life', 'Electric', 'Technology', 'Airlines', 
'Healthcare']
df = pd.DataFrame(np.random.randn(7, 4), columns = list('ABCD'), index=a)

filtered_df = None


dropdown = widgets.SelectMultiple(
                        options=df.index,
                        description='Sector',
                        disabled=False,
                        layout={'height':'100px', 'width':'40%'})

def filter_dataframe(widget):
    global filtered_df
    selection = list(widget['new'])

    with out:
        clear_output()
        display(df.loc[selection])
        filtered_df = df.loc[selection]

out = widgets.Output()
dropdown.observe(filter_dataframe, names='value')
display(dropdown)
display(out)