Pandas样式关键字仅支持行列,能否按分组子层级拆分并高亮最大值?
Pandas按分组子层级高亮最大值的实现方案
当然可以!针对你按Types和Names分组后的DataFrame,我们完全可以实现按分组子层级拆分处理,精准高亮每个子分组里的最大值。下面一步步来完成这个需求:
第一步:修正并确认分组数据
首先注意你原代码里的分组写法有个小问题,pd.groupby(df,['Types','Names']).mean()应该改为df.groupby(['Types','Names']).mean(),不然会抛出语法错误。先完整运行正确的数据准备代码:
import numpy as np import pandas as pd np.random.seed(24) df = pd.DataFrame({'Types': np.linspace(1, 10, 10)}) df = pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns=['Names','V1','V2','V3'])], axis=1) df['Types'][0:7] = "Dang" df['Types'][7:] = "Fang" df['Names'][0:3] = "Andy" df['Names'][3:8] = "Flower" df['Names'][8:] = "Avril" # 修正分组写法 df2 = df.groupby(['Types','Names']).mean() df2
运行后得到的df2是一个多级索引的DataFrame,每个层级是Types和Names的组合,我们要针对每个这样的子分组处理最大值高亮。
第二步:自定义分组高亮函数
我们需要写一个自定义函数,接收每个子分组的DataFrame,返回对应的样式规则。这里我们把每个子分组中数值列(V1、V2、V3)的最大值单元格标记为黄色背景:
def highlight_group_max(sub_df): # 找到当前子分组中V1-V3列的最大值 max_val = sub_df[['V1','V2','V3']].max().max() # 创建样式矩阵,等于最大值的单元格应用黄色背景,其余为空 style = sub_df.applymap(lambda x: 'background-color: yellow' if x == max_val else '') return style
第三步:应用样式到分组数据
利用Styler.apply方法,通过groupby参数指定我们的多级分组索引,这样函数会自动遍历每个子分组并应用样式:
styled_df = df2.style.apply(highlight_group_max, axis=None, subset=['V1','V2','V3'], groupby=['Types','Names']) styled_df
代码说明
axis=None:表示我们要处理整个DataFrame(而非按行或列)subset=['V1','V2','V3']:限定只处理数值列,避免影响其他列(这里其实只有数值列,不过显式指定更严谨)groupby=['Types','Names']:告诉Styler按这两个层级的分组来逐个处理子数据
运行后,每个(Types, Names)子分组里的最大值单元格都会被黄色背景高亮,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Animesh Saxena
相关产品推荐
相关产品推荐

