如何为多层级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
相关产品推荐
相关产品推荐

