如何批量将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+文件时,只需将上述代码封装为循环逻辑:
- 遍历所有数据源(如CSV/Excel文件)加载为DataFrame
- 调用
merge_columns_styler传入对应DataFrame和合并列列表 - 调用
to_html输出到指定路径的HTML文件即可
方案优势
- 避免了set_index方法导致的布局混乱,直接针对指定列处理
- 函数可复用,适配不同DataFrame和合并列需求
- 保留了统一的表格样式,确保输出HTML格式一致
内容的提问来源于stack exchange,提问作者The Great
相关产品推荐
相关产品推荐

