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

如何在Streamlit data_editor中实现嵌套列与可编辑复杂表格?

Streamlit data_editor嵌套列编辑问题与复杂表格实现

问题背景

需要在Streamlit的data_editor中实现嵌套列结构,但通过嵌套字典创建DataFrame后,单元格无法编辑;同时希望了解data_editor是否支持创建复杂表格。使用环境为Python 3.12.2、Streamlit 1.32.2,尝试的代码如下:

import streamlit as st
import pandas as pd

data = { 
    'col1': {
        'row 1':[1,2,3],
        'row 2':[1,2,3],
        'row 3':[1,2,3]
        },
    'col2': {
        'row 1':[1,2,3],
        'row 2':[1,2,3],
        'row 3':[1,2,3]
        }
    }
df = pd.DataFrame(data)
st.data_editor(df, num_rows='dynamic')

问题原因

上述代码中,每个单元格存储的是列表类型数据,而Streamlit data_editor默认不支持编辑列表类型的单元格,这才是无法编辑的核心原因,并非嵌套列本身的问题。

解决方案:用多层索引实现可编辑嵌套列

要实现可编辑的嵌套列,需使用Pandas的**多层列索引(MultiIndex)**来构建表格结构,确保每个单元格为单个可编辑的值:

import streamlit as st
import pandas as pd

# 创建多层列索引,对应嵌套列结构
columns = pd.MultiIndex.from_tuples([
    ('col1', 'subcol1'),
    ('col1', 'subcol2'),
    ('col1', 'subcol3'),
    ('col2', 'subcol1'),
    ('col2', 'subcol2'),
    ('col2', 'subcol3')
], names=['主列', '子列'])

# 填充单个值的单元格数据
data = [
    [1, 2, 3, 4, 5, 6],
    [7, 8, 9, 10, 11, 12],
    [13, 14, 15, 16, 17, 18]
]

df = pd.DataFrame(data, columns=columns, index=['row1', 'row2', 'row3'])

# 渲染可编辑的data_editor,支持动态添加行
edited_df = st.data_editor(df, num_rows='dynamic')

# 可选:展示编辑后的数据
st.write("编辑后的数据:")
st.dataframe(edited_df)

data_editor创建复杂表格的支持情况

data_editor完全支持创建复杂表格,通过配置参数可实现多种自定义需求:

  • 自定义列编辑器:通过column_config设置下拉框、日期选择器、数值滑块等
  • 格式控制:配置数字格式、日期格式、单元格验证规则
  • 交互功能:支持动态添加/删除行、列排序、筛选
  • 布局适配:设置use_container_width自适应容器宽度

示例:带自定义配置的复杂嵌套表格

import streamlit as st
import pandas as pd
from datetime import date

# 构建多层列的复杂表格结构
columns = pd.MultiIndex.from_tuples([
    ('基本信息', '姓名'),
    ('基本信息', '年龄'),
    ('业务数据', '销售额'),
    ('业务数据', '日期'),
    ('业务数据', '状态')
])

# 初始化数据
data = [
    ['张三', 28, 12000, date(2024, 5, 1), '已完成'],
    ['李四', 32, 18000, date(2024, 5, 2), '进行中'],
    ['王五', 25, 9500, date(2024, 5, 3), '待开始']
]

df = pd.DataFrame(data, columns=columns)

# 自定义列配置,实现复杂编辑逻辑
column_config = {
    ('基本信息', '年龄'): st.column_config.NumberColumn(
        '年龄', min_value=18, max_value=65, step=1, help='请输入18-65之间的年龄'
    ),
    ('业务数据', '销售额'): st.column_config.NumberColumn(
        '销售额', format='%d 元', min_value=0, help='输入销售额'
    ),
    ('业务数据', '日期'): st.column_config.DateColumn(
        '日期', min_value=date(2024, 1, 1), max_value=date(2024, 12, 31)
    ),
    ('业务数据', '状态'): st.column_config.SelectboxColumn(
        '状态', options=['待开始', '进行中', '已完成', '已取消'], default='待开始'
    )
}

# 渲染复杂可编辑表格
edited_df = st.data_editor(
    df,
    column_config=column_config,
    num_rows='dynamic',
    hide_index=False,
    use_container_width=True
)

st.write("编辑后的复杂表格:")
st.dataframe(edited_df)

内容的提问来源于stack exchange,提问作者esp pas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:26:24