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

使用Streamlit data_editor时持续出现KeyError,求DataFrame更新方案

解决Streamlit中DataFrame编辑保存时的KeyError问题

问题根源

你的代码存在两个核心问题导致KeyError:

  1. 初始存入st.session_state的是字典,但st.data_editor编辑后返回的是Pandas DataFrame,后续渲染时类型不匹配,引发列查找错误。
  2. st.button的args参数未按元组格式传递,args=(edited_df)会把DataFrame拆分为多个参数传入回调,导致赋值逻辑混乱。

优化的DataFrame更新方案

直接统一用Pandas DataFrame管理状态,同时修正参数传递方式,具体实现如下:

修正后的完整代码

import pandas as pd
import streamlit as st

# 初始财务数据转为带索引的DataFrame
initial_data = {
    '2022': [1000, 1000, 1000],
    '2021': [1000, 1000, 1000],
    '2020': [1000, 1000, 1000]
}
df_company_data = pd.DataFrame(initial_data, index=['营业收入', '净利润', '总资产'])

# 初始化session_state,存储DataFrame类型数据
if 'df_company_data' not in st.session_state:
    st.session_state.df_company_data = df_company_data

# 回调函数:更新session_state中的数据
def save_edits(updated_df):
    st.session_state.df_company_data = updated_df

# 展示编辑界面
st.subheader('关键财务项目(单位:百万)')
edited_df = st.data_editor(
    st.session_state.df_company_data,
    use_container_width=True,
    num_rows="dynamic"  # 可选:支持添加/删除行
)

# 保存按钮:注意args必须是元组格式(末尾加逗号)
if st.button('保存修改', on_click=save_edits, args=(edited_df,)):
    st.success('数据已成功保存!')

核心优化点

  • 统一数据类型:全程使用DataFrame存储和传递数据,彻底避免字典与DataFrame的类型冲突,从根源解决KeyError。
  • 添加业务索引:给DataFrame加上财务项目名称作为行索引,让编辑界面更直观,也避免无索引场景下的潜在渲染问题。
  • 正确传递参数:args=(edited_df,)确保将整个DataFrame作为单个参数传入回调函数,避免参数拆分错误。
  • 增强交互性:可选的num_rows="dynamic"参数支持用户添加或删除财务项目,提升工具灵活性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:30:17