st.write()适合快速预览小数据,自动渲染可排序缩放表格但无列宽拖拽等高级功能;st.dataframe()支持列宽拖拽、冻结首行等交互优化,更适合中大型数据展示。

能,而且通常5分钟内就能跑起来——前提是数据已就位、逻辑清晰,不追求生产级部署。
st.write() 和 st.dataframe() 该选哪个?
两者都用来展示表格,但行为差异直接影响用户体验和性能。
-
st.write()是“万能兜底”:传入pd.DataFrame会自动渲染成可排序、可缩放的交互表格,但不支持列宽拖拽、冻结首行等高级操作;适合快速预览或小数据( -
st.dataframe()是“专业表格控件”:默认启用横向滚动、列宽自适应,支持use_container_width=True填满页面宽度;大数据量下更稳定,且能通过column_config配置类型(比如把某列设为日期格式或进度条) - 常见错误:用
st.write(df)展示10万行CSV,页面卡顿甚至崩溃;换成st.dataframe(df, height=400)并限制高度,体验立刻改善
滑块、下拉框这些控件状态怎么保持?
Streamlit 没有显式的状态管理对象,所有状态都靠控件函数的返回值隐式维持。
- 每次用户操作(如拖动
st.slider()),整个脚本从头重跑,控件函数返回当前值——你必须用这个返回值参与后续计算,否则逻辑就断了 - 别写
value = 50; st.slider("参数", 0, 100, value)这种静态初始化,它不会响应用户操作;正确写法是slider_value = st.slider("参数", 0, 100, 50),然后用slider_value去过滤数据或生成图表 - 多控件联动时容易漏掉依赖:比如先选城市再选门店,如果门店下拉框没用城市选择结果做筛选,就会显示空选项或报错
ValueError: List of values for selectbox is empty
图表更新慢或不刷新?检查这三处
不是代码逻辑错,而是 Streamlit 的执行模型和缓存策略没对齐。
- 图表数据来自耗时操作(如读文件、调API、训练模型)?必须用
@st.cache_data包裹,否则每次交互都重新执行,用户拖一次滑块等3秒 - 用了
plt.show()或手动创建Figure对象?Streamlit 只识别直接返回的图表对象(如px.scatter(df)或st.line_chart(df)),plt.show()会报错或静默失败 - 图表依赖的变量在控件之前定义?比如把
filtered_df = df[df["city"]==selected_city]写在st.selectbox()前面,那它永远用初始值过滤——控件必须出现在相关计算之前
真正卡住人的地方,往往不是语法,而是“脚本从上到下重执行”这个前提被忽略了。哪怕只多写一行变量赋值,放在控件前面还是后面,结果可能完全不同。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











