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
相关产品推荐
相关产品推荐

