You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Jupyter Notebook中实现Ipywidgets与Pandas Dataframe交互失败求助

问题排查与修正方案

我看了你的代码,发现几个导致图表无法联动的关键问题,现在帮你逐一修正:

核心问题分析

  • 你一开始就生成了固定的data变量,点击更新按钮时并没有根据控件选择重新计算数据,所以图表始终是初始的样子
  • on_button_clicked函数里没有对DataFrame进行筛选,只是把控件值拼接了,根本没用到筛选后的数据
  • 缺少clear_output的导入,运行时会报错
  • Plotly的导入有冲突,plotly.plotly和plotly.offline重复命名为py,会导致功能异常
  • update函数没有动态生成图表的逻辑,只是重复显示初始图表

修正后的完整代码

# 导入库,修正Plotly导入冲突,添加clear_output
import pandas as pd
import folium
import geocoder
import numpy as np
import plotly.graph_objs as go
import plotly.offline as py
from ipywidgets import widgets, HBox, Output, interactive, clear_output

py.offline.init_notebook_mode(connected=False)

# 加载数据集
df = pd.read_excel('LOAS_Biography data (feb 2018).xlsx', sheetname='concerts')

# 重命名列
df.columns = ['Date', 'City', 'Country', 'Venue', 'Capacity', 'Ticket', 'Tour', 'Event', 'Sold Out', 'Champion']

# 注意:这里先保留原始数据,不要直接覆盖df!原来的groupby会丢失明细,后面无法筛选
# 先创建汇总数据用于初始下拉框选项,原始df保留用于筛选
summary_df = df.groupby('Country', as_index=False).sum()
summary_df = summary_df.head(10)

# 生成下拉框选项列表
list1 = list(summary_df['Country'].unique())

# 创建控件
w = widgets.Dropdown(
    options=list1,
    value='Australia',
    description='Country:',
    disabled=False,
)

w1 = widgets.Text(
    value='',
    placeholder='Search by Venue/City',
    description='Search:',
    disabled=False
)

w2 = widgets.Button(description="Update")

# 定义更新图表的函数,根据控件值筛选数据
def update_chart():
    # 获取控件选择的值
    selected_country = w.value
    search_text = w1.value.lower()
    
    # 筛选数据:先按国家筛选,再按搜索文本筛选(支持Venue或City)
    filtered_df = df[df['Country'] == selected_country]
    if search_text:
        filtered_df = filtered_df[
            filtered_df['Venue'].str.lower().str.contains(search_text) | 
            filtered_df['City'].str.lower().str.contains(search_text)
        ]
    
    # 对筛选后的数据按国家汇总(如果需要显示总和)
    final_df = filtered_df.groupby('Country', as_index=False).sum()
    
    # 生成新的图表数据
    data = [go.Bar(x=final_df.Country, y=final_df.Ticket)]
    
    # 显示控件和图表
    display(HBox([w, w1, w2]))
    py.offline.iplot(data, filename='jupyter-dynamic_bar')

def on_button_clicked(b):
    # 清除之前的输出,避免重复显示
    clear_output(wait=True)
    # 调用更新函数
    update_chart()

# 绑定按钮点击事件
w2.on_click(on_button_clicked)

# 初始加载图表
update_chart()

关键改动说明

  1. 保留原始DataFrame:原来的代码直接把df覆盖成汇总数据,导致后续无法根据城市/场馆筛选,现在用summary_df存汇总数据,原始df保留明细
  2. 动态生成图表数据:update_chart函数会根据下拉框选择的国家和文本框的搜索内容,实时筛选并汇总数据,生成新的柱状图
  3. 修复Plotly导入:去掉了冲突的plotly.plotly导入,只用plotly.offline,并改用go.Bar创建图表对象
  4. 完善筛选逻辑:文本框支持按场馆或城市搜索,不区分大小写
  5. 正确使用clear_output:添加了wait=True参数,避免页面闪烁

现在点击更新按钮,图表就会根据你选择的国家和搜索内容实时更新啦!

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:15:49