使用Streamlit data_editor时持续出现KeyError,求DataFrame更新方案
解决Streamlit中DataFrame编辑保存时的KeyError问题
问题根源
你的代码存在两个核心问题导致KeyError:
- 初始存入
st.session_state的是字典,但st.data_editor编辑后返回的是Pandas DataFrame,后续渲染时类型不匹配,引发列查找错误。 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
相关产品推荐
相关产品推荐

