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

