『玩转Streamlit』--可编辑表格
之前介绍过两个数据展示的组件,st.dataframe和st.table。
今天介绍的st.data_editor组件,除了展示数据的功能更加强大之外,还可以编辑数据。
1. 概要
st.data_editor组件在数据展示和编辑中都发挥着独特且重要的作用。
首先,在数据展示方面,它的优势在于:
- 直观性:以表格形式展示数据,使得数据更加直观易懂。通过该组件可以方便地查看数据集的整体结构和细节
- 适应性:能够自动适应屏幕宽度,并支持水平或垂直滚动,确保用户能方便地浏览整个数据集
- 交互性:支持对数据进行排序、筛选和搜索等操作,增强了数据的可读性和交互性
在数据编辑方面,优势也很明显:
- 灵活性:支持类电子表格编辑,可以在界面上直接对数据进行增删改操作,无需通过代码实现,提高了数据编辑的灵活性
- 定制性:提供了丰富的列定制选项,如通过
st.column_config可以设置列的标题、类型、格式以及编辑属性(如最小/最大值或步长)等,以满足不同场景下的数据编辑需求 - 多数据类型支持:支持多种数据类型的数据编辑,包括数值、文本、日期、时间等,使得数据编辑更加全面和便捷
- 状态管理:具有状态管理机制,可以记录用户的编辑操作,并在必要时进行回滚或提交。这使得数据编辑过程更加安全和可控
2. 基本用法
st.data_editor组件多用在需要实时编辑数据的情况,它主要参数有:
| 名称 | 类型 | 说明 |
|---|---|---|
| data | - | 任何适合渲染成表格的数据类型 |
| width | int | 数据编辑器的宽度,单位 px |
| height | int | 数据编辑器的高度,单位 px |
| use_container_width | bool | 是否使用父容器宽度 |
| hide_index | bool | 是否隐藏索引列 |
| column_order | [str] | 指定列的显示顺序 |
| column_config | dict | 配置列的显示方式,例如标题、可见性、类型或格式,以及编辑属性等等 |
| num_rows | str | 控制用户是否可以在数据编辑器中添加和删除行 |
| disabled | bool 或 [str] | 是否禁用编辑 |
| key | str | 组件名称,具有唯一性 |
这里重点关注两个参数,data和column_config。
data这个参数支持的数据类型非常宽泛,具体包括:pandas.DataFrame, pandas.Series, pandas.Styler, pandas.Index, pyarrow.Table, numpy.ndarray, pyspark.sql.DataFrame, snowflake.snowpark.DataFrame, list, set, tuple, dict等等。
几乎所有常用的存储数据的结构都包含了。
column_config这个参数可以高度定制列的显示和编辑行为,极大的增强了st.data_editor的能力,
在后面的高级用法中会详细介绍。
2.1. 使用示例
下面通过一个根据实际应用简化的示例来演示st.data_editor基本用法。
我们构建一个简单的产品库存管理系统,通过一个界面来展示和编辑产品的库存数据。
上面用st.data_editor来编辑表格数据,下面用st.dataframe同步显示编辑后的数据。
import streamlit as st
import pandas as pd
# 模拟产品库存数据
inventory_data = pd.DataFrame(
{
"Product ID": [1, 2, 3],
"Product Name": ["Apple", "Banana", "Cherry"],
"Quantity": [100, 150, 200],
"Price": [0.5, 0.3, 1.0],
}
)
# 使用st.data_editor展示和编辑库存数据
st.title("产品库存管理系统")
edited_inventory = st.data_editor(
inventory_data,
width=600,
height=300,
num_rows="dynamic",
)
# 显示编辑后的数据(可选,此处仅为展示效果)
st.write("编辑后的库存数据:")
st.dataframe(edited_inventory)

3. 高级用法
结合column_config参数,我们可以高度定制st.data_editor的列的显示和编辑行为。
比如:
- 自定义列显示:设置列的标题、帮助信息、格式等,使数据编辑器的界面更加友好和易读
- 控制列编辑行为:指定列的数据类型、最小值、最大值、步长等,从而控制用户对该列的编辑行为。例如,可以将一列设置为数字类型,并限制其输入范围
- 添加特殊类型的列:支持多种特殊类型的列,如图表列、进度条列、链接列等,这些特殊类型的列可以提供更丰富的数据展示和编辑体验
3.1. 使用示例
下面我们构建一个学生成绩管理系统,使用st.data_editor展示和编辑学生成绩,
并通过st.column_config定制列的显示和编辑行为。
下面的示例中,定义了每个列的标题,同时定义了各科目的最高分和显示的format。
import streamlit as st
import pandas as pd
# 模拟学生成绩数据
student_grades = pd.DataFrame(
{
"Student Name": ["Alice", "Bob", "Charlie"],
"Math": [125, 90, 140],
"Science": [38, 20, 34],
"English": [88, 114, 96],
}
)
# 定义列配置
column_config = {
"Student Name": {"label": "学生姓名"},
"Math": st.column_config.NumberColumn(
label="数学成绩",
min_value=0,
max_value=150,
format="%d 分",
),
"Science": st.column_config.NumberColumn(
label="科学成绩",
min_value=0,
max_value=40,
format="%d 分",
),
"English": st.column_config.NumberColumn(
label="英语成绩",
min_value=0,
max_value=120,
format="%d 分",
),
}
# 使用st.data_editor展示和编辑学生成绩,并应用列配置
st.title("学生成绩管理系统")
edited_grades = st.data_editor(
student_grades,
width=500,
height=300,
column_config=column_config,
num_rows="dynamic",
)
# 显示编辑后的数据(用于确认更改)
st.write("编辑后的学生成绩:")
st.dataframe(edited_grades)

下面构造一个更复杂的列的示例,其中使用了下拉框,进度条和柱状图作为列。
注意,进度条和柱状图的列是不能编辑的。
# 模拟项目数据
project_data = pd.DataFrame(
{
"Project Name": ["Project A", "Project B", "Project C"],
"Status": ["In Progress", "Completed", "Pending"],
"Progress": [60, 100, 30], # 进度百分比
"Sales": [
[1000, 1500, 500],
[200, 500, 1500],
[1800, 500, 1000],
], # 销售额
}
)
# 定义状态选项列表
statuses = ["In Progress", "Completed", "Pending", "On Hold"]
# 定义列配置
column_config = {
"Project Name": {"label": "项目名称"},
"Status": st.column_config.SelectboxColumn(
"状态",
options=statuses,
),
"Progress": st.column_config.ProgressColumn(
"进度",
min_value=0,
max_value=100,
format="%d%%", # 显示百分比
),
"Sales": st.column_config.BarChartColumn(
"销售额变化",
y_min=100,
y_max=2000,
),
}
# 使用st.data_editor展示和编辑项目数据(不包含图表列)
st.title("项目管理系统")
edited_projects = st.data_editor(
project_data,
width=500,
height=300,
column_config=column_config,
num_rows="dynamic",
)

4. 总结
总之,st.data_editor是Streamlit中一个功能强大的组件,它提供了类似电子表格的方式在线编辑DataFrame或其他类似结构的数据,直观易用。
然而,它也存在一些劣势,如状态管理复杂性、性能问题以及定制化限制等。
在实际应用中,需要根据具体需求权衡利弊,并结合Streamlit的其他组件和Python的强大生态来实现更复杂的数据处理和分析功能。
『玩转Streamlit』--可编辑表格的更多相关文章
- Github 恶搞教程(一起『玩坏』自己的 Github 吧)
最近在伯乐在线读到一篇趣文,<如何在 Github『正确』做贡献>,里面各种能人恶搞 Github 的『Public contributions』,下面截取几个小伙伴的战绩: 顺藤摸瓜,发 ...
- 2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析
2018-2019-2 20165221『网络对抗技术』Exp4:恶意代码分析 实验要求: 是监控你自己系统的运行状态,看有没有可疑的程序在运行. 是分析一个恶意软件,就分析Exp2或Exp3中生成后 ...
- 2017-2018-2 20155303『网络对抗技术』Exp9:Web安全基础
2017-2018-2 『网络对抗技术』Exp9:Web安全基础 --------CONTENTS-------- 一.基础问题回答 1.SQL注入攻击原理,如何防御? 2.XSS攻击的原理,如何防御 ...
- 2018-2019-2 20165225『网络对抗技术』Exp2:后门原理与实践
2018-2019-2 20165225『网络对抗技术』Exp2:后门原理与实践 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用socat获取主 ...
- 2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践
2018-2019-2 20165316 『网络对抗技术』Exp3:免杀原理与实践 一 免杀原理与实践说明 (一).实验说明 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件, ...
- 2017-2018-2 20155303『网络对抗技术』Exp2:后门原理与实践
2017-2018-2 『网络对抗技术』Exp2:后门原理与实践 --------CONTENTS-------- 1. 后门原理与实践实验说明 2. 常用后门工具 NC或netcat Win获得Li ...
- 2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析
2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 ...
- 2017-2018-2 20155303『网络对抗技术』Exp1:PC平台逆向破解
2017-2018-2 『网络对抗技术』Exp1:PC平台逆向破解 --------CONTENTS-------- 1. 逆向及Bof基础实践说明 2. 直接修改程序机器指令,改变程序执行流程 3. ...
- # 2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描
2017-2018-2 20155319『网络对抗技术』Exp6:信息收集与漏洞扫描 实践内容 (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.O ...
- # 2017-2018-2 20155319『网络对抗技术』Exp2:后门原理与实践
2017-2018-2 20155319『网络对抗技术』Exp2:后门原理与实践 1.实验准备 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 (0.5分) 任务二:使用s ...
随机推荐
- MRO, mixin的解读
本文试着将python中类继承中方法解析顺序MRO(method resolution order)和mixin梳理清楚 先MARK 类的继承中,super()的使用还是蛮多讲究的,因为看pytorc ...
- 算法与数据结构——AVL树(平衡二叉搜索树)
AVL树 在"二叉搜索树"章节提到,在多次插入和删除操作后,二叉搜索树可能退化为链表.在这种情况下,所有操作的时间复杂度将从O(logn)劣化为O(n). 如下图,经过两次删除节点 ...
- 第44天:WEB攻防-PHP应用&SQL盲注&布尔回显&延时判断&报错处理&增删改查方式
#PHP-MYSQL-SQL操作-增删改查 1.功能:数据查询 查询:SELECT * FROM news where id=$id 2.功能:新增用户,添加新闻等 增加:INSERT INTO ne ...
- 使用nnUNet跑BraTS脑肿瘤分割预测TC和ET非常低的原因。
使用nnUNet跑BraTS脑肿瘤分割预测TC和ET非常低,原来是预测的时候,使用了预处理后的标签.原本标签是:2:WT, 1:TC, 4:ET.但是预处理之后变为:1:WT, 2:TC, 3:ET. ...
- 2022年最新数据库经典面试题及答案汇总(含PostgreSQL、Oracle、MySQL)
随着企业数字化需求的增加,数据库行业发展日益壮大,企业对DBA岗位的需求也处于逐步增加中.我们梳理了墨天轮平台上2022年最新的一批数据库经典面试题,主要包含PostgreSQL.MySQL和Orac ...
- .NET 8 实现无实体库表 API 部署服务
前言 快速将创意变为现实!无需实体建库建表即可完成增删改查操作,支持15种条件查询.分页.列表及无限级树形列表等多种功能的API部署. 提供完善的接口文档.Auth授权.接口限流.客户端真实IP获取. ...
- day04-常用DOS命令
打开cmd的方式 开始-W-windows系统-命令提示符 win键+R键 鼠标在任意文件夹上, shift+鼠标右键 资源管理器的地址栏前面加cmd,然后回车 管理员方式运行:选择命令提示符右键以管 ...
- KubeSphere 助力提升研发效能的应用实践分享
作者:卢运强,主要从事 Java.Python 和 Golang 相关的开发工作.热爱学习和使用新技术:有着十分强烈的代码洁癖:喜欢重构代码,善于分析和解决问题.原文链接. 我司从 2022 年 6 ...
- ToDesk云电脑游戏数量?高性能显卡云桌面
玩游戏最怕遇到电脑配置跟不上,操作卡成狗不说,画面还一卡卡的,游戏体验极差. 最近被人安利了ToDesk的云电脑,可能是刚推出的,配置价格都很能打,浅用了一波拿来打APEX和荒野大镖客,体验有点惊喜到 ...
- idea项目提交到码云
第一步:创建一个项目 第二步:在码云上新建一个项目.[注意把使用Readme复选框取消掉] 第三步:复制gitee地址 第四步:创建本地git仓库 第五步:选择自己需要上传到码云的项目名 第六步:提交 ...