如何为Pandas中A列值相同的连续行添加格式区分
Pandas DataFrame 按列分组添加区分样式
针对你已经按A列排序好的DataFrame,以下两种方法可以实现分组区分(交替高亮/粗边框分组):
方法一:交替颜色高亮分组
利用A列值的变化标记分组,为奇偶组分配不同背景色,直观区分:
示例代码
import pandas as pd import numpy as np # 构造测试数据(替换为你的DataFrame) df = pd.DataFrame({ 'A': ['X', 'X', 'X', 'Y', 'Y', 'Z', 'Z', 'Z', 'Z'], 'B': np.random.randint(1, 10, 9), 'C': np.random.rand(9) }) # 生成分组ID:每遇到新的A值,ID自动+1 group_ids = df['A'].ne(df['A'].shift()).cumsum() # 定义奇偶组的背景色(可自行调整色调) color_map = {i: '#f0f8ff' if i % 2 == 1 else '#ffffff' for i in group_ids.unique()} # 应用背景色样式 styled_df = df.style.apply( lambda row: [f'background-color: {color_map[group_ids.loc[row.name]]}' for _ in row], axis=1 ) # 显示样式化后的表格 styled_df
方法二:添加粗边框划分分组
为每个相同A值的行组添加顶部/底部粗边框,明确分隔不同组:
示例代码
# 找出每个组的起始行和结束行 group_starts = df['A'].ne(df['A'].shift()) # 组第一行标记为True group_ends = df['A'].ne(df['A'].shift(-1)) # 组最后一行标记为True # 自定义边框样式函数 def add_group_borders(row): idx = row.name style_list = [] for _ in row: border_style = '' if group_starts.loc[idx]: border_style += 'border-top: 2px solid black; ' if group_ends.loc[idx]: border_style += 'border-bottom: 2px solid black; ' style_list.append(border_style) return style_list # 应用边框样式 border_styled_df = df.style.apply(add_group_borders, axis=1) border_styled_df
方法三:同时使用高亮+边框(增强区分度)
将两种样式结合,既用颜色区分,又用边框强化分组边界:
示例代码
def combine_styles(row): idx = row.name # 背景色 bg_style = f'background-color: {color_map[group_ids.loc[idx]]}; ' # 边框 border_style = '' if group_starts.loc[idx]: border_style += 'border-top: 2px solid black; ' if group_ends.loc[idx]: border_style += 'border-bottom: 2px solid black; ' return [bg_style + border_style for _ in row] combined_styled_df = df.style.apply(combine_styles, axis=1) combined_styled_df
注意事项
- 以上样式可通过
styled_df.to_html('output.html')导出为HTML文件,保留所有样式; - 若导出到Excel,需使用
openpyxl引擎,部分CSS样式可能需要适配Excel的支持范围。
内容的提问来源于stack exchange,提问作者PeaceDuck
相关产品推荐
相关产品推荐

