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

如何为pivot_table生成的DataFrame高亮指定条件行?解决KeyError

解决方法

问题原因

出现KeyError: 'overdue'是因为你的DataFrame列是多层索引(MultiIndex),直接用df_slice['overdue']无法定位到目标列。列的层级结构为:(聚合函数, 统计字段, 完成状态),必须通过完整的元组来引用列。

另外,你试图给Perfomer列设置样式,但Perfomer是索引的一部分,不是DataFrame的列,因此需要调整样式应用方式来实现整行高亮。

修正后的代码

情况1:检查「按时完成」和「逾期」的人工成本总和均为0

import pandas as pd
import numpy as np

def apply_colors(df_slice: pd.DataFrame) -> pd.DataFrame:
    # 初始化样式DataFrame,默认无样式
    styles_df = pd.DataFrame('', index=df_slice.index, columns=df_slice.columns)
    
    # 定义高亮条件:按时完成和逾期的人工成本总和都为0
    condition = (df_slice[('sum', 'labor costs', 'on schedule')] == 0) & \
                (df_slice[('sum', 'labor costs', 'overdue')] == 0)
    
    # 对满足条件的行,所有列应用银色背景
    styles_df.loc[condition, :] = 'background-color: silver'
    
    return styles_df

# 应用样式
df2.style.apply(apply_colors, axis=None)

情况2:检查「按时完成」和「逾期」的记录数量均为0

如果需要判断这两类状态下没有任何记录(而非成本总和为0),可以改用len聚合结果:

def apply_colors(df_slice: pd.DataFrame) -> pd.DataFrame:
    styles_df = pd.DataFrame('', index=df_slice.index, columns=df_slice.columns)
    
    condition = (df_slice[('len', 'labor costs', 'on schedule')] == 0) & \
                (df_slice[('len', 'labor costs', 'overdue')] == 0)
    
    styles_df.loc[condition, :] = 'background-color: silver'
    
    return styles_df

df2.style.apply(apply_colors, axis=None)

关键说明

  1. 多层索引列引用:必须使用完整的元组(aggfunc, value_col, status)定位列,比如('sum', 'labor costs', 'overdue')。
  2. 条件优先级:每个条件需要用括号包裹,避免==和&的运算符优先级冲突。
  3. 整行高亮:通过styles_df.loc[condition, :]选中满足条件的所有行和列,统一设置背景样式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:35:29