在Streamlit应用中添加滑块调整模型输入时遇KeyError问题求助
Streamlit滑块创建时KeyError问题解决
问题场景
在Streamlit中尝试通过字典创建滑块调整模型输入值,DataFrame以唯一城市名为索引,列均为浮点型数据。运行代码时触发KeyError: <class 'numpy.float64'>,错误指向st.slider所在行。
用户代码
df = pd.DataFrame({'city': ['London', 'Bedford'], 'Value_1': [0.256, 0.425], 'Value_2': [0.859, 0.956]}) df = df.set_index('city') def display_sliders(): sliders = {} for col in df.columns: min_val = df[col].min() max_val = df[col].max() val = df[col].loc[selected_city] sliders[col] = st.slider(col, min_value=min_val, max_value=max_val, value=val) return sliders # Display the slider widgets sliders = display_sliders()
错误信息
KeyError: <class 'numpy.float64'>
问题原因
selected_city类型不匹配:代码中未定义selected_city,若实际使用时该变量被赋值为numpy.float64类型(而非DataFrame索引中的字符串城市名),.loc[]无法匹配字符串索引,直接触发KeyError。- 数值类型兼容性:
df[col].loc[selected_city]返回的是numpy.float64类型,与Streamlit滑块的参数类型存在潜在兼容问题。
解决方案
修改后的完整代码
import streamlit as st import pandas as pd df = pd.DataFrame({'city': ['London', 'Bedford'], 'Value_1': [0.256, 0.425], 'Value_2': [0.859, 0.956]}) df = df.set_index('city') # 添加城市选择控件,确保selected_city为字符串类型的城市名 selected_city = st.selectbox("选择城市", df.index.tolist()) def display_sliders(): sliders = {} for col in df.columns: min_val = df[col].min() max_val = df[col].max() # 将numpy浮点值转为Python原生float,消除类型兼容问题 val = float(df[col].loc[selected_city]) sliders[col] = st.slider(col, min_value=min_val, max_value=max_val, value=val) return sliders # 显示滑块控件 sliders = display_sliders()
关键修复点
- 通过
st.selectbox明确获取字符串类型的城市名,确保selected_city与DataFrame索引类型完全匹配。 - 将
val转为Python原生float类型,解决Streamlit滑块与numpy数值类型的潜在冲突。
内容的提问来源于stack exchange,提问作者kmedri
相关产品推荐
相关产品推荐

