是否有Python函数可为交叉表添加额外层级,实现类Excel分层表格?
实现Excel风格的分层汇总表格
你可以用Pandas的分组统计+多级索引+样式设置来实现这种分层表格效果,无需拆分多个DataFrame,直接在单个DataFrame内构建层级并匹配Excel样式。以下是具体实现步骤:
1. 构建数据并生成分层统计结构
先将你的数据导入Pandas DataFrame,然后按Col3→Col2→Col1的层级分组统计记录数,生成带多级索引的交叉表:
import pandas as pd # 构造你的原始数据 data = [ ["A", "Red", "Cheetah"], ["A", "Red", "Cheetah"], ["A", "Red", "Cheetah"], ["A", "Blue", "Cheetah"], ["A", "Blue", "Cheetah"], ["A", "Blue", "Cheetah"], ["A", "Blue", "Cheetah"], ["A", "Blue", "Cheetah"], ["B", "Blue", "Cheetah"], ["B", "Blue", "Cheetah"], ["C", "Blue", "Cheetah"], ["C", "Blue", "Cheetah"], ["C", "Blue", "Lion"], ["C", "Blue", "Lion"], ["C", "Orange", "Lion"], ["C", "Orange", "Lion"], ["A", "Orange", "Lion"], ["A", "Orange", "Lion"], ["A", "Orange", "Lion"], ["A", "Orange", "Lion"], ["A", "Red", "Lion"], ["A", "Red", "Lion"], ["A", "Red", "Bear"], ["A", "Red", "Bear"], ["A", "Red", "Bear"], ["B", "Red", "Bear"], ["B", "Green", "Bear"], ["B", "Green", "Bear"], ["C", "Green", "Bear"], ["C", "Green", "Bear"], ["C", "Green", "Bear"] ] df = pd.DataFrame(data, columns=["Col1", "Col2", "Col3"]) # 按层级分组统计,生成多级索引的交叉表 count_df = df.groupby(["Col3", "Col2", "Col1"]).size().unstack(fill_value=0) count_df = count_df.reset_index().set_index(["Col3", "Col2"])
这段代码会生成一个以Col3(动物类型)为一级索引、Col2(颜色)为二级索引的DataFrame,列对应Col1的分类(A/B/C),值为对应组合的记录数量,完全匹配你需要的分层结构。
2. 匹配Excel样式的可视化处理
如果需要还原Excel中合并同类单元格的视觉效果,可以通过以下方式实现:
- 导出Excel时,启用
merge_cells=True参数,自动合并重复的层级单元格; - 若需要网页端展示,用Pandas的
Styler工具设置样式:
# 导出为Excel,自动合并层级单元格 count_df.to_excel("hierarchical_table.xlsx", merge_cells=True) # (可选)网页端样式设置,模拟Excel合并效果 def style_table(styler): # 设置层级样式,区分一级/二级索引 styler.set_table_styles([ {'selector': 'th.level0', 'props': [('background-color', '#f0f0f0'), ('font-weight', 'bold')]}, {'selector': 'th.level1', 'props': [('padding-left', '20px')]}, {'selector': 'td, th', 'props': [('border', '1px solid #ccc')]} ]) # 隐藏重复的索引标签 styler.hide(axis='index', names=True) return styler styled_table = count_df.style.pipe(style_table) styled_table.to_html("hierarchical_table.html")
核心函数说明
groupby(["Col3", "Col2", "Col1"]).size():按指定层级分组统计频次,是构建分层交叉表的核心;unstack(fill_value=0):将分组后的行索引转为列,生成交叉表结构;set_index(["Col3", "Col2"]):构建多级行索引,实现分层展示;to_excel(merge_cells=True):导出Excel时自动合并重复的层级单元格,完全还原目标样式。
无需额外特殊函数,Pandas自带的分组、索引操作和导出工具就能满足你的需求。
内容的提问来源于stack exchange,提问作者Ahmed Tawakol
相关产品推荐
相关产品推荐

