Streamlit中基于用户输入的计算列不生效问题求助
解决方案
你的问题核心在于初始计算列只执行了一次,没有基于用户修改后的新数据重新计算,同时原计算函数的行处理逻辑存在错误。以下是修正后的完整代码,实现计算列随用户输入自动更新:
import pandas as pd import numpy as np import streamlit as st # 初始化会话状态中的DataFrame,避免页面刷新重置数据 if 'dummy_df' not in st.session_state: dummy_df = pd.DataFrame(index=np.arange(5)) dummy_df["col_a"] = pd.Series(dtype='float') dropdown = ("A", "B") # 正确设置col_b的分类类型 dummy_df["col_b"] = pd.Categorical([], categories=dropdown, dtype="category") st.session_state.dummy_df = dummy_df x = 0.5 y = 0.9 z = 0.3 total = x + y + z # 重写计算函数:针对每行数据处理,不再引用全局旧数据 def calculate_col_c(row): # 根据当前行的col_b取值计算current if pd.isna(row['col_a']): return np.nan current = -row['col_a'] if row['col_b'] == "A" else row['col_a'] # 判断并返回结果 return "A" if (current - total) > 0 else "B" def calculate_col_d(row): if pd.isna(row['col_a']): return np.nan current = -row['col_a'] if row['col_b'] == "A" else row['col_a'] return current * (1 - total) - total # 获取用户修改后的最新数据 edited_df = st.experimental_data_editor(st.session_state.dummy_df, key='item_data') # 基于修改后的数据重新计算列 if not edited_df.empty: edited_df['col_c'] = edited_df.apply(calculate_col_c, axis=1) edited_df['col_d'] = edited_df.apply(calculate_col_d, axis=1) # 更新会话状态中的数据 st.session_state.dummy_df = edited_df # 展示最终计算结果 st.dataframe(st.session_state.dummy_df)
关键修改点说明
- 会话状态持久化:用
st.session_state存储DataFrame,确保页面刷新时不会丢失用户输入的数据 - 获取修改后的数据:通过
st.experimental_data_editor的返回值edited_df拿到用户最新的输入 - 修正计算逻辑:计算函数直接接收当前行数据,针对每行的
col_a和col_b值计算,避免引用全局旧数据;同时增加了空值判断,防止报错 - 实时重新计算:每次获取到修改后的数据,立即重新计算
col_c和col_d,并更新会话状态
内容的提问来源于stack exchange,提问作者KatyLearnR
相关产品推荐
相关产品推荐

