如何为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)
关键说明
- 多层索引列引用:必须使用完整的元组
(aggfunc, value_col, status)定位列,比如('sum', 'labor costs', 'overdue')。 - 条件优先级:每个条件需要用括号包裹,避免
==和&的运算符优先级冲突。 - 整行高亮:通过
styles_df.loc[condition, :]选中满足条件的所有行和列,统一设置背景样式。
内容的提问来源于stack exchange,提问作者irina_ikonn
相关产品推荐
相关产品推荐

