Streamlit开发中如何追加DataFrame数据并实现CSV下载、保持页面展示
Streamlit 实现DataFrame动态追加行+CSV下载+数据留存方案
核心实现目标:
- 支持交互触发DataFrame行追加操作
- 提供一键下载CSV文件的按钮
- 所有操作触发页面重跑后,DataFrame数据仍能正常展示、不丢失
方案1:使用session_state管理数据(推荐,适配绝大多数场景)
这是Streamlit官方推荐的跨重跑状态管理方案,数据存储在会话状态中,不管是点击追加行按钮还是下载按钮触发页面重跑,数据都不会重置,适配各类复杂交互场景。
import pandas as pd import streamlit as st # 初始化会话状态中的结果表,仅首次运行时创建空表 if "df_result" not in st.session_state: st.session_state['df_result'] = pd.DataFrame(columns=['h1','h2']) # 追加行的回调函数 def onAddRow(): new_row = { 'h1':"something", 'h2':"something", } # 注意:pandas 2.0及以上版本已移除append方法,可替换为以下写法避免报错: # st.session_state['df_result'] = pd.concat([st.session_state['df_result'], pd.DataFrame([new_row])], ignore_index=True) st.session_state['df_result'] = st.session_state['df_result'].append(new_row, ignore_index=True) # 绑定追加行按钮 st.button("Add row", on_click = onAddRow) # 缓存CSV转换逻辑,避免重复计算 @st.cache def convert_df(df): return df.to_csv().encode('utf-8') # 绑定下载按钮 st.download_button( "Press to Download", convert_df(st.session_state.df_result), "file.csv", "text/csv", key='download-csv' ) # 页面渲染最终结果表 st.dataframe(st.session_state['df_result'])
方案2:基于全局变量实现(仅适合简单演示,不推荐)
该方案写法简单,可以实现基础的行追加效果,但存在明显缺陷:Streamlit每次触发组件交互(比如点击下载按钮)都会重跑整个页面脚本,全局变量会被重新初始化,已经追加的行数据会直接丢失,表格视图会重置为初始空状态。
import pandas as pd import streamlit as st # 初始化空表 df_log = pd.DataFrame(columns=['h1','h2']) df_log_process = st.dataframe(df_log) # 循环追加行示例 for x in range(10): new_row = { 'h1':"something", 'h2':"something", } # 同方案1提示,pandas2.0+请替换为pd.concat写法 df_log = df_log.append(new_row, ignore_index=True) df_log_process = df_log_process.dataframe(df_log)
内容的提问来源于stack exchange,提问作者Natakran Pimthong
相关产品推荐
相关产品推荐

