如何用Pandas处理DataFrame并生成合并重复单元格的HTML表格?
解决思路与实现步骤
一、过滤DataFrame(筛选目标列/行)
筛选需要展示的列直接通过列索引即可,若需同时过滤行(如时间范围、事件类型),结合布尔索引实现:
示例代码
# 假设原始数据为df,筛选目标列(比如timestamp_utc、symbol、event、value) selected_df = df[['timestamp_utc', 'symbol', 'event', 'value']] # 若需附加行过滤条件(比如筛选2024年上半年的事件) selected_df = selected_df[ (selected_df['timestamp_utc'] >= '2024-01-01') & (selected_df['timestamp_utc'] <= '2024-06-30') ] # 若要合并非连续的相同值,先按目标列排序(确保相同值连续) selected_df = selected_df.sort_values(by=['symbol', 'timestamp_utc'])
二、合并相同值的单元格(生成带合并效果的HTML表格)
Pandas没有内置直接合并单元格的函数,但可以通过Styler自定义CSS样式实现——核心是计算连续重复值的分组,给组内第一个单元格设置rowspan属性,隐藏后续重复单元格:
实现代码
import pandas as pd def calculate_rowspan(df, target_col): # 标记连续相同值的分组ID group_ids = df[target_col].ne(df[target_col].shift()).cumsum() # 计算每个分组的行数 group_counts = group_ids.value_counts().sort_index() # 生成每个单元格的rowspan值:组首单元格为分组行数,其余为0(后续隐藏) rowspan_list = [] current_group = None for gid in group_ids: if gid != current_group: current_group = gid rowspan_list.append(group_counts[gid]) else: rowspan_list.append(0) return rowspan_list def apply_merge_style(df, merge_columns): styler = df.style for col in merge_columns: colspan = df.columns.get_loc(col) + 1 # HTML列索引从1开始 rowspan_list = calculate_rowspan(df, col) # 给组首单元格设置rowspan属性 styler.set_table_styles([ { 'selector': f'td:nth-child({colspan}):nth-of-type({i+1})', 'props': [('rowspan', str(rowspan_list[i]))] } for i in range(len(rowspan_list)) if rowspan_list[i] > 1 ], overwrite=False) # 隐藏重复的单元格(rowspan为0的项) styler.applymap( lambda val, idx: 'display: none;' if rowspan_list[idx] == 0 else '', subset=pd.IndexSlice[:, col], idx=df.index ) return styler # 使用示例:合并symbol和timestamp_utc列的重复单元格 merged_styler = apply_merge_style(selected_df, ['symbol', 'timestamp_utc']) # 生成最终HTML表格 html_table = merged_styler.to_html()
关键说明
- 仅对连续出现的相同值生效,若需合并非连续的相同值,必须先对目标列排序(如示例中的
sort_values)。 Styler生成的HTML会保留合并单元格的样式,直接嵌入网页即可展示效果。- 若需合并列方向的重复值(colspan),逻辑类似,只需计算列方向的分组并设置
colspan属性。
内容的提问来源于stack exchange,提问作者Bruce Ecurb
相关产品推荐
相关产品推荐

