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

Python+Streamlit读取Excel子列并展示为DataFrame的问题排查

问题排查结果

你的代码存在3个直接导致渲染异常的问题:

  • 变量传参错误:你单独创建了df_new做表头转换,但最终调用st.dataframe()时传入的是未做任何处理的原始df,前面的表头处理逻辑完全没有生效
  • 未适配多级合并表头:你的Excel是父列+子列的合并单元格结构,pd.read_excel()默认仅将第一行识别为表头,合并单元格除首格外其余位置均为空值,根本无法识别父子列的从属关系
  • 切片对象错误:你对原始df设置列名后赋值给df_new,后续切分数据时调用的是df.iloc[1:],列名设置操作没有作用到最终使用的数据集上
修复方案

核心是读取时直接识别多级表头,完成列名处理后再传入Streamlit渲染,修正后可直接运行的代码如下:

import pandas as pd
import streamlit as st

st.set_page_config(
    page_title="KPI Documentation",
    page_icon=":bar_chart:",
    layout="wide"
)

file_path = 'file.xlsx'
# 读取时指定前2行为多级表头,对应Excel的父列、子列层级
df = pd.read_excel(
    file_path,
    index_col=None,
    na_values=['NA'],
    usecols="B,C,E,F,J:O",
    header=[0, 1]
)

# 扁平化处理多级列名:填充合并单元格空值,拼接父列+子名为最终列名,避免渲染兼容问题
df.columns = df.columns.map(
    lambda col_pair: f"{col_pair[0]}-{col_pair[1]}" if pd.notna(col_pair[1]) else col_pair[0]
)
# 清除全空的无效行,重置索引
df = df.dropna(how="all").reset_index(drop=True)

agree = st.button('click to see the table:')
if agree:
    st.subheader("Information")
    # 传入处理完成的数据集,开启容器宽度适配
    st.dataframe(df, use_container_width=True)
补充说明
  • 如果你需要保留原生多级表头的层级展示效果,直接删除扁平化列名的代码段即可,Streamlit 1.20及以上版本已原生支持pandas多级表头的表格渲染
  • 如果你的Excel表头不在文件最顶部的前两行,修改header参数的行号为实际表头所在位置即可(pandas读取Excel时行号从0开始计数)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:12:22