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

如何使用双键字典为Pandas DataFrame设置样式?

问题:Pandas DataFrame根据(列名, NUM值)组合键设置单元格背景样式

原始代码

import numpy as np
import pandas as pd
import random

# 构建目标DataFrame
NUM = list(range(1, 29))
R1 = np.random.randint(-10, 11, size=28)
R2 = np.random.randint(-10, 11, size=28)
R3 = np.random.randint(-10, 11, size=28)
R4 = np.random.randint(-10, 11, size=28)
R5 = np.random.randint(-10, 11, size=28)

data = {
    'NUM': NUM,
    'R1': R1,
    'R2': R2,
    'R3': R3,
    'R4': R4,
    'R5': R5
}
df = pd.DataFrame(data)

# 构建颜色映射字典,键为(R列名, NUM值)
claves = [(f'R{i}', j) for i in range(1, 6) for j in range(1, 29)]
colores_posibles = ['yellow', None, 'orange', 'red', 'purple']
color_dict = {clave: random.choice(colores_posibles) for clave in claves}

原代码错误分析

原代码使用applymap实现样式,但存在两个关键问题:

  1. applymap是逐单元格处理,传入函数的是单个单元格值(不是Series),所以isinstance(val, pd.Series)永远为False,函数直接返回空字符串,样式完全不生效。
  2. 单个单元格值无法直接关联到对应的行NUM值和列名,必须借助能获取行列上下文的方法。

解决方案

方案一:使用style.apply按行处理

style.apply支持按行传递整个Series,能直接获取当前行的NUM值和各列列名,是最简洁的实现方式:

def apply_style_row(row):
    # 初始化样式列表,长度与行一致
    styles = [''] * len(row)
    num_val = row['NUM']
    # 遍历所有R列
    for col in ['R1', 'R2', 'R3', 'R4', 'R5']:
        col_idx = row.index.get_loc(col)
        key = (col, num_val)
        color = color_dict.get(key)
        if color is not None:
            styles[col_idx] = f'background-color: {color}'
    return styles

# 应用样式,仅处理R1-R5列
styled_df = df.style.apply(apply_style_row, axis=1, subset=pd.IndexSlice[:, 'R1':'R5'])
# 显示样式后的表格
styled_df

方案二:预构建样式DataFrame再应用

先创建与原DataFrame结构一致的样式DataFrame,填充对应背景色样式后再应用,适合需要调试样式结果的场景:

# 初始化样式DataFrame,所有单元格默认空样式
style_df = pd.DataFrame('', index=df.index, columns=df.columns)

# 遍历每个R列和每行,填充对应样式
for col in ['R1', 'R2', 'R3', 'R4', 'R5']:
    for idx in df.index:
        num_val = df.loc[idx, 'NUM']
        key = (col, num_val)
        color = color_dict.get(key)
        if color is not None:
            style_df.loc[idx, col] = f'background-color: {color}'

# 应用样式
styled_df = df.style.apply(lambda x: style_df.loc[x.index, x.columns], axis=None)
styled_df

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:22:43