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

切换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:26