在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()
关键改动说明
- 保留原始DataFrame:原来的代码直接把
df覆盖成汇总数据,导致后续无法根据城市/场馆筛选,现在用summary_df存汇总数据,原始df保留明细 - 动态生成图表数据:
update_chart函数会根据下拉框选择的国家和文本框的搜索内容,实时筛选并汇总数据,生成新的柱状图 - 修复Plotly导入:去掉了冲突的
plotly.plotly导入,只用plotly.offline,并改用go.Bar创建图表对象 - 完善筛选逻辑:文本框支持按场馆或城市搜索,不区分大小写
- 正确使用clear_output:添加了
wait=True参数,避免页面闪烁
现在点击更新按钮,图表就会根据你选择的国家和搜索内容实时更新啦!
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

