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

如何为二级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:11:01