如何在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
相关产品推荐
相关产品推荐

