Streamlit交互式仪表盘多列求和实现问题求助
Streamlit交互式仪表盘:筛选后按地区分组年份求和实现方案
直接上可运行的完整代码,对应你需求中的所有功能:
import streamlit as st import pandas as pd # 创建示例数据集 data = { 'Name': ['a', 'b', 'c', 'd'], 'Region': ['e', 'f', 'e', 'f'], 2017: [3, 4, 3, 3], 2018: [3, 5, 6, 7], 2019: [1, 2, 3, 1] } df = pd.DataFrame(data) # 设置页面标题 st.title('地区-年份数据统计仪表盘') # 1. 添加交互式筛选组件 ## 地区多选框 available_regions = df['Region'].unique().tolist() selected_regions = st.multiselect('选择地区', available_regions, default=available_regions) ## 年份范围滑块 year_columns = [col for col in df.columns if isinstance(col, int)] selected_years = st.slider('选择年份范围', min_value=min(year_columns), max_value=max(year_columns), value=(2018, 2019)) # 2. 执行数据筛选 filtered_df = df.query("Region in @selected_regions") # 整理成只显示选中年份的数据集(和你示例里的输出格式一致) display_df = filtered_df[['Name', 'Region'] + list(range(selected_years[0], selected_years[1]+1))] st.subheader('筛选后的数据集') st.dataframe(display_df) # 3. 计算求和结果 ## 按年份分组求和,用于绘制柱状图 year_sum = filtered_df[list(range(selected_years[0], selected_years[1]+1))].sum().reset_index() year_sum.columns = ['年份', '求和值'] ## 计算选中年份的总求和(对应你例子中的13) total_sum = year_sum['求和值'].sum() st.subheader(f'选中年份总求和: {total_sum}') # 4. 绘制交互式柱状图 st.subheader('各年份求和柱状图') st.bar_chart(year_sum.set_index('年份'))
关键逻辑拆解
筛选与求和的关联:
先通过df.query得到符合用户选择地区的filtered_df,这是所有计算的基础。接着根据用户选的年份范围提取对应列,直接对这些列执行sum(),就把筛选结果和求和计算绑定在了一起——筛选条件变了,求和结果会自动更新。求和结果的两种用法:
- 按年份单独求和:整理成带“年份”和“求和值”的DataFrame,直接传给
st.bar_chart()就能生成交互式柱状图。 - 总求和:把各年份的求和结果再加总,就是你需要的13这类数值,直接展示即可。
- 按年份单独求和:整理成带“年份”和“求和值”的DataFrame,直接传给
Streamlit的自动联动:
不用写额外的事件监听代码,用户调整地区或年份选择时,整个代码会自动重新执行,筛选后的数据集、求和数值、图表都会同步更新,这是Streamlit自带的特性。
内容的提问来源于stack exchange,提问作者yukee
相关产品推荐
相关产品推荐

