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

Pandas透视表多级索引空表头空行移除及Styler适配问题

Pandas透视表美化及问题修复方案

问题修复代码

第一步:修正透视表生成逻辑,解决A、B问题

import pandas as pd
import numpy as np

# 示例数据
data = [
['AAA',2,'X',3,5,1],
['AAA',2,'Y',1,10,2],
['AAA',2,'Z',2,15,3],
['BBB',3,'X',3,15,3],
['BBB',3,'Y',1,10,2],
['BBB',3,'Z',2,5,1],
['CCC',1,'X',3,10,2],
['CCC',1,'Y',1,15,3],
['CCC',1,'Z',2,5,1],
]
df = pd.DataFrame(data, columns = ['Name','Name_Rank','Bucket','Bucket_Rank','Price','Change'])

# 修正后的透视表生成代码
df2 = (
    pd.pivot_table(df, values=['Price','Change'], index=['Bucket_Rank','Bucket'], 
                   columns=['Name_Rank','Name'], aggfunc=np.mean)
    # 按Name_Rank排序后删除该层级,移除整数排序值表头,解决问题A
    .sort_index(axis=1, level='Name_Rank')
    .droplevel('Name_Rank', axis=1)
    # 调整值字段层级到最内层,匹配预期的表头结构
    .swaplevel(axis=1)
    .reindex(['Price','Change'], level=1, axis=1)
    # 按Bucket_Rank排序后清理行索引
    .sort_index(level='Bucket_Rank')
    .reset_index()
    .drop('Bucket_Rank', axis=1)
    .set_index('Bucket')
    # 同时清空行、列所有索引层级名,消除表头与数据之间的空白行,解决问题B
    .rename_axis(index=None, columns=[None, None])
)

第二步:配置Styler样式,解决C问题

通过Styler的CSS配置可以单独给不同层级的表头设置样式,和数据行完全区隔:

styled_report = df2.style.set_table_styles([
    # 第一级表头(Name行)样式
    {'selector': 'th.heading.level0',
     'props': [
         ('background-color', '#165DFF'),
         ('color', '#fff'),
         ('text-align', 'center'),
         ('padding', '8px 16px'),
         ('border', '1px solid #e5e7eb')
     ]},
    # 第二级表头(Price/Change行)样式
    {'selector': 'th.heading.level1',
     'props': [
         ('background-color', '#4080FF'),
         ('color', '#fff'),
         ('text-align', 'center'),
         ('padding', '8px 16px'),
         ('border', '1px solid #e5e7eb')
     ]},
    # 行表头(Bucket列)样式
    {'selector': 'th.row_heading',
     'props': [
         ('background-color', '#165DFF'),
         ('color', '#fff'),
         ('text-align', 'center'),
         ('padding', '8px 16px'),
         ('border', '1px solid #e5e7eb')
     ]},
    # 数据行样式
    {'selector': 'td',
     'props': [
         ('text-align', 'center'),
         ('padding', '8px 16px'),
         ('border', '1px solid #e5e7eb')
     ]},
    # 偶数行斑马纹效果,提升可读性
    {'selector': 'tr:nth-child(even)',
     'props': [('background-color', '#F2F3F5')]}
# 可选添加报表标题
]).set_caption("业务核心指标报表")

# 如需导出为HTML用于邮件分发,直接调用to_html方法即可
# report_html = styled_report.to_html()

解决逻辑说明

  • 问题A:利用droplevel方法直接在内存中删除Name_Rank对应的列索引层级,无需导出Excel再导入的额外操作。
  • 问题B:之前的rename_axis仅设置了列层级名,未清空行索引名,本次同时设置index=None和columns=[None, None],彻底清除所有层级名,消除空白行。
  • 问题C:Pandas Styler会自动给多级表头的不同层级添加level0、level1类标识,通过CSS选择器即可单独配置各级表头的样式,与数据行样式互不影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:54:04