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

Streamlit中能否在DataFrame添加checkbox列并获取选中行

可行性结论

这个需求完全可以实现,用Streamlit原生组件就能完成,不需要接入第三方插件。

核心实现逻辑
  • 不要尝试直接给纯数据结构的pandas DataFrame塞入前端复选框控件,通过Streamlit自带的可编辑表格组件配置复选框列,就能实现每一行对应一个勾选框的效果
  • 组件会实时同步用户的勾选状态,直接从组件返回值里筛选布尔值为真的行,就能拿到所有被勾选的对应数据
  • 每个复选框不需要手动维护状态,组件内部会自动做状态绑定,只要保证表格行索引唯一就不会出现状态错乱
可直接复用的实现代码
import streamlit as st
import pandas as pd

# 初始化你的业务数据表
df = pd.DataFrame({
    "商品名称": ["笔记本电脑", "无线鼠标", "机械键盘", "27寸高刷显示器"],
    "单价": [5999, 129, 399, 1299],
    "库存": [120, 2300, 890, 320]
})
# 初始化勾选状态列,默认全部未选中
df["勾选"] = False

st.subheader("数据列表")
# 渲染带复选框列的可编辑表格
table_result = st.data_editor(
    df,
    column_config={
        "勾选": st.column_config.CheckboxColumn(
            label="选择行",
            default=False,
        )
    },
    hide_index=True,
    use_container_width=True
)

# 筛选所有被勾选的行
selected_rows = table_result[table_result["勾选"] == True]

st.subheader("已勾选的行数据")
if selected_rows.empty:
    st.info("暂未勾选任何数据行")
else:
    # 展示的时候可以去掉勾选状态列,只保留业务字段
    st.dataframe(selected_rows.drop(columns=["勾选"]), hide_index=True, use_container_width=True)
兼容说明

如果你使用的是1.23.0之前的旧版Streamlit,没有内置的复选框列配置能力,可以用逐行渲染的方式实现:

  • 遍历DataFrame的每一行,为每一行生成独立的st.checkbox,key设置为和行号绑定的唯一值(比如f"row_check_{idx}")
  • 遍历所有checkbox的状态,把勾选状态为True的对应行数据拼接成新的DataFrame即可
  • 这种方式实现效率略低于可编辑表格方案,数据量超过1000行的时候会有明显渲染延迟

内容的提问来源于stack exchange,提问作者Alexandro Nascimento

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:48:20