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

如何为Pandas透视表按指定条件应用Styler单元格着色?

Pandas透视表Procent列条件格式实现方案

报错原因

你遇到的The truth value of a Series is ambiguous错误,是因为自定义格式函数中直接对整个Series进行布尔判断(比如df['Procent'] >= 100),Pandas无法确定整个Series的布尔值,必须针对单个元素或单行数据做逐值判断。

正确实现方案

以下分两种场景给出代码,可根据你实际的透视表结构选择:

1. 模拟数据与透视表生成

先匹配场景模拟原始数据和透视表:

import pandas as pd
import numpy as np

# 原始DataFrame示例
df = pd.DataFrame({
    'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
    'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
    'Value': [5, 15, 12, 8, 20, 9],
    'Procent': [80, 120, 90, 75, 110, 60]
})

# 生成MultiIndex列的透视表(也可生成普通列透视表,按需调整)
pivot = pd.pivot_table(
    df,
    values=['Value', 'Procent'],
    index=['Category'],
    columns=['Subcategory'],
    aggfunc=np.mean
)

2. 自定义样式函数(MultiIndex列场景)

针对MultiIndex列的透视表,需通过元组定位对应的Value和Procent列:

def format_procent_col(df):
    def style_row(row):
        styles = []
        for col in row.index:
            # 仅处理Procent列
            if col[0] == 'Procent':
                # 获取同行对应的Value列
                value_col = ('Value', col[1])
                if row[value_col] < 10:
                    styles.append('background-color: #cccccc')  # 灰色
                else:
                    p_val = row[col]
                    if 0 <= p_val < 100:
                        styles.append('background-color: #ffff00')  # 黄色
                    elif p_val >= 100:
                        styles.append('background-color: #ff0000')  # 红色
                    else:
                        styles.append('')
            else:
                styles.append('')
        return styles
    # 逐行应用样式规则
    return df.apply(style_row, axis=1)

# 应用样式到透视表
styled_pivot = pivot.style.apply(format_procent_col, axis=None)
# Jupyter环境直接输出styled_pivot查看结果,本地可导出为HTML保存
styled_pivot

3. 自定义样式函数(普通列场景)

如果你的透视表是普通单层级列(仅Value和Procent两列),函数可简化为:

def format_procent_simple(row):
    # 仅处理Procent列,Value列保持默认样式
    if row['Value'] < 10:
        return ['', 'background-color: #cccccc']
    else:
        p_val = row['Procent']
        if 0 <= p_val < 100:
            return ['', 'background-color: #ffff00']
        elif p_val >= 100:
            return ['', 'background-color: #ff0000']
        else:
            return ['', '']

# 应用样式(axis=1表示逐行处理)
styled_pivot = pivot.style.apply(format_procent_simple, axis=1)

关键注意事项

  • 必须用style.apply配合axis=1(逐行)处理,才能同时访问同行的Value和Procent值
  • 样式返回的是与每行列数对应的字符串列表,每个字符串对应一个单元格的CSS样式
  • 颜色代码可根据需求替换(比如#cccccc是浅灰色,#ffff00是亮黄色)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 12:54:20