ipywdigets中的下拉菜单

问题描述

我想使用ipywidgets添加一个下拉框。我有一个带有Pandas DataFrame的函数,想通过下拉菜单选择要显示的行数。我有这个:

get_forwards = interactive(
    get_forwards,{"manual": True,"manual_name": "Forwards"},)
get_forwards

与此:

widgets = [get_squad,get_goalkeepers,get_defenders,get_midfielders,get_forwards]
names = ["squad","Goalkeepers","Defenders","Midfielders","Forwards"]
view = Tab(widgets)
for i in range (len(view.children)):
    view.set_title(i,names[i])
view

如果可能的话,我想在每个标签添加一个下拉框。有人可以帮忙吗?

解决方法

我怀疑您因建立互动而陷入困境。我们将深入探讨如何解决编程中这一具有挑战性但又令人兴奋的方面。

第1步:创建示例数据
如果我们能模仿您期望的结果,那么我们这里的人们将无济于事。我在下面为您创建了一个示例。

import pandas as pd

data = [
        {"Position":"Goalkeeper","Name":"Sam","Team":"Blue"},{"Position":"Defender","Name":"Rob",{"Position":"Goalkeeper","Name":"Sara","Team":"Red"},"Name":"Sue","Name":"Alex","Team":"Orange"},"Name":"Amy","Name":"Fifi","Team":"Purple"},"Name":"Farrell",]
df = pd.DataFrame.from_records(data)

第2步:为要过滤的字段构建交互式小部件
当然,您可以将它们添加到interact方法中,但这不是最佳实践+它不能提供精细的控制。这是我为您构建的一些小部件:

from ipywidgets import widgets

# Multi-Select
position_widget = widgets.SelectMultiple(
    options=df["Position"].unique(),value=[df["Position"].unique()[1]],description="Position",)

team_widget = widgets.SelectMultiple(
    options=df["Team"].unique(),value=[df["Team"].unique()[1]],description="Team",)

# Choose how many rows you want
n_widget = widgets.IntSlider(
    value=len(df),min=1,max=len(df),step=1,description='Max rows?',disabled=False,continuous_update=False,# Only update when the user has released the slider
    style={'description_width': 'initial'} # allow the long description
)

第3步:定义交互式视图
在这里,您可以将小部件与功能进行匹配。注意,我正在做一个非常简单的选择操作。您在这里不受任何限制。

from IPython.display import display

def show_df(n=n_widget,team=team_widget,position=position_widget):
  # Filter – Be sure NOT to overwrite your data
  df_filtered = df[(df["Team"].isin(team) & df["Position"].isin(position))].head(n)
  display(df_filtered) # this will display your dataframe nicely

第4步:调用交互式功能
本质上,您是在显示小工具。

my_gadget = widgets.interact(show_df)

display(my_gadget)

知道了!

enter image description here