切换Streamlit组件/页面时保留数据编辑器修改内容的方法
解决Streamlit切换页面后编辑的DataFrame丢失问题
问题场景
使用Streamlit和Pandas编写的代码中,侧边栏选择框"A""B"分别对应一个可编辑DataFrame。选择"A"并编辑表格(如添加行a4、值4),切换到"B"再切回"A"时,df1会恢复初始状态——因为每次切换页面都会重新执行生成初始DataFrame的函数,导致编辑数据丢失。要求不使用@st.cache_data,保持DataFrame可持续编辑。
解决方案核心
利用Streamlit的st.session_state存储编辑后的DataFrame,它能在页面切换、刷新时保留状态,避免每次重新生成初始数据。
修改后的完整代码
import streamlit as st import pandas as pd # 初始化session_state中的DataFrame,仅在首次运行时设置初始值 if "df1" not in st.session_state: st.session_state.df1 = pd.DataFrame({"col1": ["a1", "a2", "a3"], "Values": [1, 2, 3]}) if "df2" not in st.session_state: st.session_state.df2 = pd.DataFrame({"col1": ["b1", "b2", "b3"], "Values": [1, 2, 3]}) # 侧边栏选择框,用key绑定到session_state,自动保留选中状态 page = st.sidebar.selectbox("Select: ", ("A","B"), key="selected_page") def funct1(): # 直接使用session_state中的df1,编辑后将结果存回session_state edited_df = st.experimental_data_editor(st.session_state.df1, num_rows="dynamic") st.session_state.df1 = edited_df def funct2(): # 同理处理df2 edited_df = st.experimental_data_editor(st.session_state.df2, num_rows="dynamic") st.session_state.df2 = edited_df if page == "A": funct1() elif page == "B": funct2()
关键改动说明
- 初始化session_state:判断
df1/df2是否存在于session_state中,不存在则创建初始DataFrame,确保仅首次加载时生成初始数据,后续使用保存的编辑后数据。 - 绑定编辑结果到session_state:数据编辑器的返回值直接赋值给
st.session_state.df1/st.session_state.df2,每次编辑后自动保存状态。 - 简化侧边栏选择框:通过
key="selected_page"让Streamlit自动管理选中状态,无需手动处理索引逻辑,避免原代码中的错误。
效果验证
编辑"A"对应的表格(添加行a4、值4),切换到"B"再切回"A",表格会保留编辑后的内容:
df1 a1 1 a2 2 a3 3 a4 4
内容的提问来源于stack exchange,提问作者user21968603
相关产品推荐
相关产品推荐

