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

如何为多层级DataFrame应用指定规则的条件样式?

为多层级列索引的DataFrame设置单元格样式

我有一个通过如下代码构造的多层级列索引DataFrame:

from collections import defaultdict
import pandas as pd

dic = {'US':{'Quality':{'points':"-2 n", 'difference':'equal', 'stat': 'same'}, 
             'Prices':{'points':'-7 n', 'difference':'negative', 'stat': 'below'}, 
             'Satisfaction':{'points':'3 n', 'difference':'positive', 'stat': 'below'}},
       'UK': {'Quality':{'points':'3 n', 'difference':'equal', 'stat': 'above'}, 
              'Prices':{'points':'-13 n', 'difference':'negative', 'stat': 'below'}, 
              'Satisfaction':{'points':'2 n', 'difference':'negative', 'stat': 'same'}}}
d1 = defaultdict(dict)
for k, v in dic.items():
    for k1, v1 in v.items():
        for k2, v2 in v1.items():
            d1[(k, k2)].update({k1: v2})

df = pd.DataFrame(d1)

需要按照以下规则设置单元格样式:

  • 如果difference为negative,对应组的points单元格字体颜色设为红色;若difference为equal,points单元格字体颜色设为灰色
  • 若stat为below或above,该stat单元格字体颜色设为红色且背景颜色设为蓝色

解决方案

使用Pandas的Styler工具结合自定义样式函数实现需求:

def style_cells(val, col):
    # 处理points列的样式逻辑
    if col[1] == 'points':
        diff_value = df.loc['difference', (col[0], 'difference')]
        if diff_value == 'negative':
            return 'color: red'
        elif diff_value == 'equal':
            return 'color: gray'
    # 处理stat列的样式逻辑
    elif col[1] == 'stat':
        if val in ('below', 'above'):
            return 'color: red; background-color: blue'
    # 默认无样式
    return ''

# 应用样式到DataFrame
styled_df = df.style.applymap(style_cells, col=df.columns)
# 渲染显示
styled_df

关键说明

  • 自定义函数style_cells接收单元格值和对应的列索引(格式为(国家, 字段))
  • 针对points列,通过列索引的国家标识,匹配对应difference列的值来设置字体颜色
  • 针对stat列,直接判断单元格值是否符合条件,设置字体与背景色
  • 通过applymap传递列索引参数,确保每个单元格能匹配到对应的判断条件

内容的提问来源于stack exchange,提问作者M J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:15:29