如何为二级MultiIndex的Pandas DataFrame实现通用交替行着色?
通用化二级MultiIndex DataFrame行着色方案
问题背景
现有代码可实现二级MultiIndex DataFrame的行交替着色,但需手动配置颜色映射与索引相关参数,无法直接复用在其他同结构DataFrame上,需将逻辑通用化,实现无需手动适配即可处理任意二级MultiIndex的DataFrame。
通用化实现方案
将着色逻辑封装为可复用函数,自动处理索引识别、颜色生成与样式配置,以下是完整实现:
通用着色函数
import pandas as pd from itertools import cycle def color_multiindex_rows(df, base_colors=None): # 检查是否为二级MultiIndex if not isinstance(df.index, pd.MultiIndex) or df.index.nlevels != 2: raise ValueError("仅支持二级MultiIndex的DataFrame") # 默认颜色组:交替浅色调,可通过base_colors参数自定义 if base_colors is None: base_colors = [ (0.6, 0.8, 0.8, 1), # 浅蓝 (1, 0.9, 0.4, 1), # 浅黄 (0.8, 0.6, 0.8, 1) # 浅紫 ] # 为每个一级索引值分配循环颜色 level0_unique = df.index.get_level_values(0).unique() color_cycle = cycle(base_colors) color_map = {level: next(color_cycle) for level in level0_unique} # 生成两种透明度的颜色:完全不透明和半透明 c_full = {k: (int(r*255), int(g*255), int(b*255), a) for k, (r,g,b,a) in color_map.items()} c_transparent = {k: (int(r*255), int(g*255), int(b*255), 0.25) for k, (r,g,b,a) in color_map.items()} # 获取一级索引组内的行序号与全局行索引 idx_level0 = df.index.get_level_values(0) group_cumcount = df.groupby(idx_level0).cumcount() zipped = zip(group_cumcount, enumerate(idx_level0)) # 生成CSS样式列表 css_styles = [ {'selector': f'.row{i}', 'props': [('background-color', f'rgba{c_full[j]}')]} if v % 2 == 0 else {'selector': f'.row{i}', 'props': [('background-color', f'rgba{c_transparent[j]}')]} for v, (i, j) in zipped ] # 返回带样式的DataFrame return df.style.set_table_styles(css_styles)
使用示例
# 测试用二级MultiIndex DataFrame i = pd.MultiIndex.from_tuples( [(0, 'zero'), (0, 'one'), (1, 'zero'), (1, 'one'), (1, 'two'), (1, 'three'), (1, 'four'), (2, 'zero'), (2, 'one'), (2, 'two'), (2, 'three'), (2, 'four')], names=['level_0', 'level_1'] ) df = pd.DataFrame(range(0, len(i)), index=i, columns=['foo']) # 应用通用着色函数 styled_df = color_multiindex_rows(df) styled_df
自定义颜色
若需使用自定义颜色,传入base_colors参数即可:
custom_colors = [ (0.9, 0.7, 0.7, 1), # 浅红 (0.7, 0.9, 0.7, 1) # 浅绿 ] styled_df = color_multiindex_rows(df, base_colors=custom_colors)
方案说明
- 自动索引校验:函数先验证输入DataFrame是否为二级MultiIndex,避免错误输入
- 颜色自动分配:通过循环为每个一级索引值分配颜色,无需手动映射
- 灵活定制:支持通过
base_colors参数自定义基础颜色组 - 样式自动生成:根据每个一级索引组内的行序号,自动生成交替着色的CSS样式
内容的提问来源于stack exchange,提问作者Haikal Yeo
相关产品推荐
相关产品推荐

