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

如何批量将Pandas DataFrame指定列转为HTML合并单元格?

实现Pandas DataFrame指定列HTML单元格合并(批量处理场景)

问题背景

有如下Pandas DataFrame:

import pandas as pd
data = {
    'A': [1, 1, 2, 2, 3],
    'B': [10, 10, 20, 20, 30],
    'C': [100, 101, 200, 201, 300],
    'D': ['X', 'X', 'Y', 'Y', 'Z'],
    'E': ['Alpha', 'Beta', 'Beta', 'Gamma', 'Gamma'],
    'F': [1000, 1001, 1002, 1003, 1004]
}
df = pd.DataFrame(data)

需求是批量处理300+HTML文件,实现指定列(如A、B列)的同值单元格合并。曾尝试通过设置索引实现合并,但输出布局混乱,尝试代码如下:

res = df.set_index(['A', 'B','C'])
s = res.style
s = s.set_properties(
        **{'border': '1px black solid !important','font-size': '10pt'}).set_table_attributes(
        'style="border-collapse:collapse"').set_table_styles([{
        'selector': '.col_heading',
        'props': 'background-color:black; font-size:9pt; color: white; border-collapse: collapse; border: 1px black solid !important;'
        }])
output = s.to_html("table.html",escape=False,index=False)

更新后的示例DataFrame如下,需要合并Project_name、Application、Past_products这类同值列:

df = pd.DataFrame({
    'Project_name': ['ABC', 'ABC', 'DEF', 'DEF', 'XYZ'],
    'Application': ['App1', 'App1', 'App2', 'App2', 'App3'],
    'Past_products': ['P1', 'P1', 'P2', 'P2', 'P3'],
    'Current_Product': ['C1', 'C2', 'C3', 'C4', 'C5'],
    'Recommendation_type': ['Type1', 'Type1', 'Type2', 'Type2', 'Type3'],
    'Rec_products': ['R1', 'R2', 'R3', 'R4', 'R5']
})

解决方案

以下是可批量复用的实现方法,通过自定义Styler函数计算单元格rowspan并隐藏重复行,避免布局混乱:

核心代码

import pandas as pd

def merge_columns_styler(df, merge_cols):
    # 复制数据避免修改原DataFrame
    styled_df = df.copy()
    
    # 计算每个合并列的rowspan及重复行标记
    rowspan_info = {}
    for col in merge_cols:
        # 按连续相同值分组,计算每组长度(即rowspan值)
        group_ids = styled_df[col].ne(styled_df[col].shift()).cumsum()
        row_lengths = group_ids.map(group_ids.value_counts())
        # 标记是否为重复行(需要隐藏)
        duplicate_mask = styled_df[col].eq(styled_df[col].shift())
        rowspan_info[col] = (row_lengths, duplicate_mask)
    
    # 初始化Styler并设置基础样式
    style_obj = styled_df.style
    style_obj = style_obj.set_properties(**{
        'border': '1px black solid !important',
        'font-size': '10pt'
    }).set_table_attributes('style="border-collapse:collapse"')
    
    # 设置表头样式
    style_obj = style_obj.set_table_styles([{
        'selector': '.col_heading',
        'props': 'background-color:black; font-size:9pt; color: white; border-collapse: collapse; border: 1px black solid !important;'
    }])
    
    # 应用rowspan设置和重复单元格隐藏
    for col, (row_spans, duplicates) in rowspan_info.items():
        col_index = styled_df.columns.get_loc(col)
        for idx in styled_df.index:
            if duplicates.loc[idx]:
                # 隐藏重复行的对应单元格
                style_obj = style_obj.hide([idx], subset=[col])
            else:
                # 为分组首行设置rowspan
                style_obj = style_obj.set_properties(
                    **{'rowspan': str(row_spans.loc[idx])}, 
                    subset=[idx, col]
                )
    
    return style_obj

# 示例使用
if __name__ == "__main__":
    # 加载目标DataFrame
    target_df = pd.DataFrame({
        'Project_name': ['ABC', 'ABC', 'DEF', 'DEF', 'XYZ'],
        'Application': ['App1', 'App1', 'App2', 'App2', 'App3'],
        'Past_products': ['P1', 'P1', 'P2', 'P2', 'P3'],
        'Current_Product': ['C1', 'C2', 'C3', 'C4', 'C5'],
        'Recommendation_type': ['Type1', 'Type1', 'Type2', 'Type2', 'Type3'],
        'Rec_products': ['R1', 'R2', 'R3', 'R4', 'R5']
    })
    
    # 指定需要合并的列
    cols_to_merge = ['Project_name', 'Application', 'Past_products']
    # 获取配置好的Styler对象
    final_style = merge_columns_styler(target_df, cols_to_merge)
    # 输出到HTML文件
    final_style.to_html("merged_table.html", escape=False)

批量处理说明

批量处理300+文件时,只需将上述代码封装为循环逻辑:

  1. 遍历所有数据源(如CSV/Excel文件)加载为DataFrame
  2. 调用merge_columns_styler传入对应DataFrame和合并列列表
  3. 调用to_html输出到指定路径的HTML文件即可

方案优势

  • 避免了set_index方法导致的布局混乱,直接针对指定列处理
  • 函数可复用,适配不同DataFrame和合并列需求
  • 保留了统一的表格样式,确保输出HTML格式一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:56:01