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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 04:39:57