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

Streamlit中根据用户选择获取DataFrame值触发KeyError问题

问题根因
  • 直接将整个DataFrame传入st.selectbox作为可选选项时,Streamlit会默认读取DataFrame的列名作为选项列表,不会读取你期望的第一列奖励名称,选中值和后续匹配逻辑完全不匹配。
  • 未设置自定义索引的DataFrame默认用从0开始的整数作为行标签,直接将选中的奖励名称传入.loc做行标签匹配,自然找不到对应行触发KeyError。
可行修复方案

你可以任选以下一种实现方式:

方案1:不修改原DataFrame索引,用布尔索引取值

不需要调整原DataFrame结构,直接修正选择器的选项源,再通过列值匹配取对应价格,代码如下:

# 取DataFrame第一列的所有奖励名称作为下拉框选项
selected_reward = st.selectbox(
    "Choose a reward",
    reward_options_df.iloc[:, 0],
    index=0
)

# 筛选选中奖励对应的行,提取金币价格
selected_reward_price = reward_options_df[
    reward_options_df.iloc[:, 0] == selected_reward
]["Price (Coins)"].iloc[0]

# 可直接在页面展示结果
st.write(f"当前选中奖励所需金币:{selected_reward_price}")

方案2:设置索引后使用.loc取值

如果你希望保留.loc的写法,可以先将奖励名称列设置为DataFrame的行索引再做匹配:

# 将第一列(奖励名称列)设置为行索引
indexed_reward_df = reward_options_df.set_index(reward_options_df.columns[0])

# 直接取索引值作为下拉框选项
selected_reward = st.selectbox(
    "Choose a reward",
    indexed_reward_df.index,
    index=0
)

# 用.loc按行标签匹配取值
selected_reward_price = indexed_reward_df.loc[selected_reward, "Price (Coins)"]

提示:如果奖励列表存在重名项,建议新增唯一ID列作为匹配依据,避免匹配到多条结果引发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 23:45:54