如何合并DataFrame中的单元格并转换为指定目标格式?
DataFrame 合并单元格导出实现方案
实现步骤
- 先准备好你的原始DataFrame,提前确认哪些列需要做单元格合并,注意如果同列相同值不是连续排列的,先按对应列排序,保证相同值连续,否则合并结果不符合预期
- 借助
openpyxl作为Excel读写引擎,因为pandas原生不支持直接导出合并单元格的Excel,需要操作Excel工作表对象完成合并逻辑 - 逐列遍历需要合并的字段,识别连续重复值的行范围,对范围内的单元格执行合并操作,最后统一设置对齐样式优化展示效果
可直接复用的代码
import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Alignment # ========== 替换成你自己的DataFrame即可 ========== # 示例数据匹配常规分组类表格结构,实际使用时替换成你的df df = pd.DataFrame({ "大区": ["华东", "华东", "华东", "华北", "华北", "华南"], "省份": ["江苏", "江苏", "浙江", "北京", "天津", "广东"], "城市": ["南京", "苏州", "杭州", "北京", "天津", "广州"], "销售额": [1200, 1500, 1800, 2000, 900, 2200] }) # 导出基础无合并的Excel文件 save_path = "合并单元格结果.xlsx" df.to_excel(save_path, index=False, engine="openpyxl") # ========== 执行单元格合并逻辑 ========== wb = load_workbook(save_path) ws = wb.active # 配置需要合并的列:Excel列号从1开始计数,示例合并第1列(大区)、第2列(省份),按需增减 merge_columns = [1, 2] # 配置单元格居中对齐样式 align_style = Alignment(horizontal="center", vertical="center") for col_idx in merge_columns: merge_start_row = 2 # 第1行是表头,数据从第2行开始 base_value = ws.cell(row=merge_start_row, column=col_idx).value # 遍历所有数据行,多遍历1行用于处理最后一段合并区间 for row_idx in range(3, ws.max_row + 2): current_value = ws.cell(row=row_idx, column=col_idx).value if row_idx <= ws.max_row else None if current_value != base_value: # 区间长度大于1才需要合并 if row_idx - 1 > merge_start_row: ws.merge_cells( start_row=merge_start_row, start_column=col_idx, end_row=row_idx - 1, end_column=col_idx ) # 更新下一段合并区间的起始位置和基准值 merge_start_row = row_idx base_value = current_value # 全表设置居中对齐 for row in ws.iter_rows(): for cell in row: cell.alignment = align_style # 保存最终结果 wb.save(save_path)
说明
- 如果你的需求是导出带合并单元格的HTML而非Excel,可以在
df.to_html()生成的表格代码基础上,给连续重复值对应的<td>标签添加rowspan属性实现,逻辑和上述Excel合并逻辑一致 - 代码运行前需要确保已经安装依赖,执行
pip install pandas openpyxl安装即可
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

