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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:07:30