Pandas教程:如何将DataFrame中相同值单元格合并为单个单元格
解决方案
核心思路
问题根源是唯一ID的唯一性导致分组后无法合并同组行,所以需要先对数据做聚合处理,再通过Pandas的样式功能实现目标格式,最后导出HTML用于报告。
步骤1:数据聚合(消除唯一ID干扰)
假设你的DataFrame列结构为 [分组列1, 分组列2, 唯一ID, 指标列1, 指标列2,...],先按前两列分组,对指标列做聚合(根据业务需求选择sum/max/字符串拼接等),唯一ID如果不需要展示可直接排除:
import pandas as pd # 假设原始DataFrame为df agg_df = df.groupby(['分组列1', '分组列2']).agg( 指标列1=('指标列1', 'sum'), # 替换为符合业务的聚合函数 指标列2=('指标列2', 'sum') ).reset_index()
如果需要保留同组的唯一ID(比如用逗号拼接所有ID),可以这样写:
agg_df = df.groupby(['分组列1', '分组列2']).agg( 唯一ID集合=('唯一ID', ', '.join), 指标列1=('指标列1', 'sum'), 指标列2=('指标列2', 'sum') ).reset_index()
步骤2:设置多级索引并调整样式
通过Pandas的style模块配置合并单元格、缩进等样式,匹配你的目标格式:
# 设置多级索引 agg_df = agg_df.set_index(['分组列1', '分组列2']) # 配置HTML样式:合并相同分组列1的单元格、缩进分组列2 html_table = agg_df.style.set_table_styles( [ # 表头样式 {'selector': 'thead th', 'props': [('background-color', '#f5f5f5'), ('border', '1px solid #ddd')]}, # 分组列1合并后垂直居中 {'selector': 'th.level0', 'props': [('vertical-align', 'middle'), ('border', '1px solid #ddd')]}, # 分组列2缩进显示 {'selector': 'th.level1', 'props': [('padding-left', '25px'), ('border', '1px solid #ddd')]}, # 数据单元格样式 {'selector': 'td', 'props': [('border', '1px solid #ddd')]} ] ).merge_cells(rows=True) # 合并同组的行单元格,避免重复显示分组内容 # 若需隐藏某个索引层级(比如只展示分组列1的合并单元格),可取消下方注释 # html_table = html_table.hide(axis='index', level=0)
步骤3:导出为HTML
将样式化后的表格转为HTML字符串,直接用于报告:
html_output = html_table.to_html() # 也可保存为本地HTML文件 with open('report_table.html', 'w', encoding='utf-8') as f: f.write(html_output)
关键说明
merge_cells(rows=True)是实现同组行单元格合并的核心,确保相同分组的内容不会重复显示。- 聚合函数的选择要贴合业务场景,数值类用sum/avg,字符串类用join。
- 若目标样式有特殊格式(如配色、字体),可在
set_table_styles中添加更多CSS属性。
内容的提问来源于stack exchange,提问作者Suyash
相关产品推荐
相关产品推荐

