如何在Pandas的background_gradient中忽略值为100的最大值以生成热力图
解决方案:忽略100值的热力图样式
要实现忽略所有值为100的元素应用颜色渐变,同时保留NaN的白色背景,你可以用以下几种方法修改代码:
方法一:使用gmap自定义渐变计算矩阵
这个方法通过创建一个仅包含非100值的矩阵供渐变计算使用,同时保持原始数据的显示,最后将100值的单元格设为白色:
import pandas as pd df = pd.DataFrame({'2021-04': {'2021-04': 100.0, '2021-05': float("nan"), '2021-06': float("nan")}, '2021-05': {'2021-04': 9.599326432568967, '2021-05': 100.0, '2021-06': float("nan")}, '2021-06': {'2021-04': 7.952995602884856, '2021-05': 5.549312064243707, '2021-06': 100.0}}) # 创建用于渐变计算的矩阵,将100替换为NaN gradient_map = df.where(df != 100) # 应用渐变+设置NaN和100为白色 df.style.background_gradient(cmap='RdYlGn', axis=1, gmap=gradient_map)\ .highlight_null(null_color='white')\ .applymap(lambda val: 'background-color: white' if val == 100 else '')
解释:
gmap参数指定了颜色渐变的计算依据,我们把100替换为NaN后,这些值就不会参与渐变的颜色映射计算。applymap专门为值为100的单元格设置白色背景,和NaN保持一致。
方法二:限定渐变范围+高亮100值
先计算出排除100后的数值范围,再用这个范围控制渐变,最后把100值的单元格设为白色:
# 获取排除100后的最小/最大值 vmin = df[df != 100].min().min() vmax = df[df != 100].max().max() # 应用渐变+设置NaN和100为白色 df.style.background_gradient(cmap='RdYlGn', axis=1, vmin=vmin, vmax=vmax)\ .highlight_null(null_color='white')\ .applymap(lambda val: 'background-color: white' if val == 100 else '')
解释:
vmin和vmax限定了颜色渐变的数值区间,完全基于非100的值计算,避免100干扰渐变的颜色分布。- 同样用
applymap把100值的单元格统一设为白色,和NaN视觉上保持一致。
方法三:用掩码选择渐变范围
通过布尔掩码直接指定需要应用渐变的单元格,再处理100和NaN的颜色:
# 创建掩码:选择所有不等于100的单元格 mask = df != 100 # 仅对掩码内的单元格应用渐变,再设置白色背景 df.style.background_gradient(cmap='RdYlGn', axis=1, subset=mask)\ .highlight_null(null_color='white')\ .applymap(lambda val: 'background-color: white' if val == 100 else '')
解释:
subset=mask让渐变只作用于非100的单元格,100的单元格默认保持背景色,再通过applymap统一设为白色。- 这种方法更直观,明确控制渐变的作用范围。
内容的提问来源于stack exchange,提问作者Sergio Polimante




