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
相关产品推荐
相关产品推荐

