如何忽略pandas背景梯度的最大值

问题描述 投票:0回答:2

我有这个数据框:

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}})

我想按线绘制它的热图,但忽略最大值,因为它们比其他值高得多。

我也想给nan一个浅色,比如白色,但我把这部分做对了。

这是我到目前为止得到的:

df.style.background_gradient(cmap ='RdYlGn', axis=1)\
                .highlight_null(null_color='white')

产生此表:

enter image description here

如何应用渐变忽略等于 100 的值?

python pandas heatmap pandas-styles
2个回答
0
投票

如果我理解正确,这里有一个建议(深受@quant的回答这里的启发):

import pandas as pd
import numpy as np

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}})

def highlight_max(data, color='white'):
    attr = f'background-color: {color}'
    if data.ndim == 1:
        is_max = data == data.max()
        return [attr if v else '' for v in is_max]
    else:
        is_max = data == data.max().max()
        return pd.DataFrame(np.where(is_max, attr, ''),
                            index=data.index, columns=data.columns)
    
out = (df.style.background_gradient(cmap ='RdYlGn', axis=1)
      .highlight_null(null_color='white')
      .applymap(lambda x: 'color: white' if pd.isnull(x) else 'color: black')
      .apply(highlight_max, axis=None)
     )

>>> print(out)

enter image description here


0
投票

您可以使用:

df.replace(100, np.nan).style.background_gradient(cmap ='RdYlGn', axis=1)\
                       .highlight_null(color='white')

如果“100”值没有用。

© www.soinside.com 2019 - 2024. All rights reserved.