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

求Python Streamlit实现表格列内嵌动态子表格的代码方案

要在Streamlit中实现表格列内嵌子表格的效果,由于原生st.dataframe/st.table不支持嵌套结构,我们可以通过手动构建HTML表格并渲染的方式实现,以下是具体方案:

实现思路

Streamlit支持通过st.markdown渲染自定义HTML,我们可以构造包含嵌套表格的HTML代码,将主表格指定单元格替换为子表格的HTML内容,从而实现内嵌效果。子表格的数据可以动态生成,行数会随数据自动扩展。

完整示例代码

import streamlit as st
import pandas as pd

# 构造主表格数据
main_data = {
    "HColumn1": ["Name", "Age", "Address"],
    "HColumn2": ["Alice", 30, ""]  # 预留Address对应的单元格用于嵌入子表格
}
main_df = pd.DataFrame(main_data)

# 构造动态子表格数据(可根据实际需求从API/数据库获取)
address_data = {
    "Location": ["Home", "Office", "Gym"],
    "Details": ["123 Main St", "456 Business Ave", "789 Fitness Rd"]
}
address_df = pd.DataFrame(address_data)

def generate_nested_table(main_df, sub_df, target_row, target_col):
    """生成包含内嵌子表格的HTML代码"""
    # 初始化主表格HTML
    html = '<table border="1" cellpadding="6" cellspacing="0" style="border-collapse: collapse; width: 100%;">'
    
    # 添加主表格表头
    html += '<tr style="background-color: #f0f2f6;">'
    for col in main_df.columns:
        html += f'<th style="text-align: left; padding: 8px;">{col}</th>'
    html += '</tr>'
    
    # 遍历主表格行,插入子表格到指定位置
    for idx, row in main_df.iterrows():
        html += '<tr>'
        for col in main_df.columns:
            if idx == target_row and col == target_col:
                # 插入子表格
                html += '<td style="padding: 8px;">'
                html += '<table border="1" cellpadding="4" cellspacing="0" style="border-collapse: collapse; width: 100%;">'
                # 子表格表头
                html += '<tr style="background-color: #e6e8eb;">'
                for sub_col in sub_df.columns:
                    html += f'<th style="text-align: left; padding: 6px;">{sub_col}</th>'
                html += '</tr>'
                # 子表格数据行
                for _, sub_row in sub_df.iterrows():
                    html += '<tr>'
                    for sub_val in sub_row.values:
                        html += f'<td style="padding: 6px;">{sub_val}</td>'
                    html += '</tr>'
                html += '</table>'
                html += '</td>'
            else:
                html += f'<td style="padding: 8px;">{row[col]}</td>'
        html += '</tr>'
    
    html += '</table>'
    return html

# 生成嵌套表格HTML(指定第3行(索引2)的HColumn2列嵌入子表格)
nested_table_html = generate_nested_table(main_df, address_df, target_row=2, target_col="HColumn2")

# 渲染嵌套表格
st.markdown(nested_table_html, unsafe_allow_html=True)

关键说明

  1. 动态扩展子表格:只需更新address_data的内容,子表格会自动根据数据行数扩展,无需修改HTML生成逻辑。
  2. 样式自定义:通过调整HTML中的style属性,可以修改表格的边框、背景色、内边距等样式,适配你的页面设计。
  3. 灵活定位:通过target_row和target_col参数,可以指定任意主表格单元格嵌入子表格,满足不同位置的需求。

如果需要更复杂的交互(比如子表格排序、筛选),可以考虑使用streamlit-aggrid库,通过自定义单元格渲染器实现内嵌表格,但上述HTML方案无需额外依赖,更轻量易用。

内容的提问来源于stack exchange,提问作者Prathima Golla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:25:16