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

使用st.data_editor时DataFrame仅两次修改后更新的问题排查

解决Streamlit Data Editor实时更新列的问题

问题根源

你的代码存在三个核心问题导致更新延迟和失效:

  • on_change参数误用:你直接调用了update_dataframe(),而非传递函数对象(应写update_dataframe不带括号),导致函数在组件渲染时就执行,而非编辑触发时
  • 全局变量失效:Streamlit每次交互都会重新运行整个脚本,全局boq_df会被重置,无法保留编辑后的状态
  • 更新时机错误:依赖回调的方式不符合Streamlit的执行流程,应该先获取编辑后的数据集再执行更新逻辑

修改后的代码

main.py(无需改动)

from page import page

page()

page.py(核心修改)

import streamlit as st
import pandas as pd


def update_dataframe(df):
    # 避免修改原数据,返回新的处理后的DataFrame
    updated_df = df.copy()
    updated_df.loc[updated_df["ANALYZE"] == False, "TYPE"] = None
    updated_df.ffill(inplace=True)
    return updated_df


def page():
    # 使用session_state存储数据,避免每次脚本重跑丢失状态
    if "boq_df" not in st.session_state:
        st.session_state.boq_df = pd.DataFrame()

    st.write("# Test")

    if st.button("Analyze", type="primary"):
        st.session_state.boq_df = pd.DataFrame(
            data={
                "ANALYZE": [True, False, True],
                "CAT": ["Car", "Truck", "Bike"],
                "TYPE": ["blue", None, "yellow"],  # 初始值修正为None而非False,保持类型一致
                "DESC": ["two door", "four door", "single"],
            }
        )

    if not st.session_state.boq_df.empty:
        # 先获取用户编辑后的DataFrame
        edited_df = st.data_editor(st.session_state.boq_df, height=700)
        # 立即执行更新逻辑并同步到session_state
        st.session_state.boq_df = update_dataframe(edited_df)

关键修改说明

  • 用session_state存储数据:Streamlit的st.session_state会在交互间保留数据,解决全局变量被重置的问题
  • 移除错误的on_change回调:改为直接获取编辑后的edited_df再处理,更符合Streamlit的线性执行逻辑
  • 纯函数式更新:update_dataframe改为接收df并返回新的处理后的数据,避免直接修改全局状态引发的同步问题
  • 初始数据类型修正:把TYPE列的初始False改为None,保持列类型统一,避免后续填充时的类型错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:42:20