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

如何在Streamlit中通过form_submit_button逐行填充DataFrame

解决Streamlit表单提交后逐行添加数据到DataFrame的问题

核心问题在于Streamlit每次交互都会重新运行整个脚本,你之前的代码没有保存历史数据,所以每次提交都会覆盖掉之前的行。要实现逐行添加,必须用st.session_state来持久化存储DataFrame。

实现步骤

  • 初始化会话状态中的DataFrame:在脚本开头检查st.session_state是否包含存储数据的键(比如'data_df'),如果没有则创建一个空的DataFrame。
  • 构建用户输入表单:包含下拉框、滑块等组件。
  • 处理表单提交:点击提交按钮时,收集当前输入的信息,将其转换为一行数据,追加到会话状态的DataFrame中。
  • 展示更新后的DataFrame:每次提交后,从st.session_state中取出最新的DataFrame进行展示。

完整代码示例

import streamlit as st
import pandas as pd

# 初始化会话状态中的DataFrame
if 'data_df' not in st.session_state:
    st.session_state.data_df = pd.DataFrame(columns=['类别', '数值'])

# 构建表单
with st.form(key='input_form'):
    # 下拉选择框
    category = st.selectbox('选择类别', ['A类', 'B类', 'C类'])
    # 滑块组件
    value = st.slider('选择数值', 0, 100, 50)
    
    # 提交按钮
    submit_button = st.form_submit_button(label='提交数据')

# 处理提交逻辑
if submit_button:
    # 创建新的行数据
    new_row = pd.DataFrame({'类别': [category], '数值': [value]})
    # 追加到会话状态的DataFrame中(用concat替代已弃用的append)
    st.session_state.data_df = pd.concat([st.session_state.data_df, new_row], ignore_index=True)

# 展示最新的DataFrame
st.dataframe(st.session_state.data_df)

关键说明

  • st.session_state是Streamlit用来在用户会话中保存数据的工具,只要会话不结束(页面不关闭或刷新),里面的数据就会一直保留。
  • 使用pd.concat来合并旧DataFrame和新行数据,ignore_index=True可以避免索引重复的问题。
  • 每次点击提交按钮,脚本重新运行时,会先从st.session_state中读取之前保存的DataFrame,再追加新数据,这样就能实现逐行填充的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 21:24:51