12

我有以下代码将数据框转储到 HTML 中的表中,以便根据 seaborn 的颜色图对results其中的列进行着色。TIME_FRAMES

import seaborn as sns

TIME_FRAMES = ["24h", "7d", "30d", "1y"]

# Set CSS properties for th elements in dataframe
th_props = [
    ('font-size', '11px'),
    ('text-align', 'center'),
    ('font-weight', 'bold'),
    ('color', '#6d6d6d'),
    ('background-color', '#f7f7f9')
]

# Set CSS properties for td elements in dataframe
td_props = [
    ('font-size', '11px')
]


cm = sns.light_palette("green", as_cmap=True)
s = (results.style.background_gradient(cmap=cm, subset=TIME_FRAMES)
                  .set_table_styles(styles))
a = s.render()
with open("test.html", "w") as f:
    f.write(a)

由此,我得到警告:

/python3.7/site-packages/matplotlib/colors.py:512:RuntimeWarning:在 less xa[xa < 0] = -1 中遇到无效值

而且,正如您在下图中看到的那样,列30d1y没有正确呈现,因为它们有 NaN。我怎样才能做到这一点,以便忽略 NaN 并且仅使用有效值呈现颜色?将 NaN 设置为 0 不是一个有效的选项,因为这里的 NaN 本身就有意义。

在此处输入图像描述

4

3 回答 3

4

有点晚了,但供将来参考。

我有同样的问题,这是我解决它的方法:

import pandas as pd
import numpy as np
dt = pd.DataFrame({'col1': [1,2,3,4,5], 'col2': [4,5,6,7,np.nan], 'col3': [8,2,6,np.nan,np.nan]})

先填写数值大的nas

dt.fillna(dt.max().max()+1, inplace=True)

将此最大值的字体着色为白色的函数

def color_max_white(val, max_val):
    color = 'white' if val == max_val else 'black'
    return 'color: %s' % color

将最大值的背景着色为白色的函数

def highlight_max(data, color='white'):
    attr = 'background-color: {}'.format(color)
    if data.ndim == 1:  # Series from .apply(axis=0) or axis=1
        is_max = data == data.max()
        return [attr if v else '' for v in is_max]
    else:  # from .apply(axis=None)
        is_max = data == data.max().max()
        return pd.DataFrame(np.where(is_max, attr, ''),
                            index=data.index, columns=data.columns)

把所有东西放在一起

max_val = dt.max().max()

dt.style.format("{:.2f}").background_gradient(cmap='Blues', axis=None).applymap(lambda x: color_max_white(x, max_val)).apply(highlight_max, axis=None)

在此处输入图像描述

这个链接帮助我回答了

于 2020-07-30T08:19:03.797 回答
3

这对我来说很好

df.style.applymap(lambda x: 'color: transparent' if pd.isnull(x) else '')
于 2021-09-14T21:42:46.497 回答
1

@quant 的答案几乎对我有用,但我的背景渐变仍会使用最大值来计算颜色渐变。我实现了@night-train 的建议来设置颜色图,然后使用了两个函数:

import copy
cmap = copy.copy(plt.cm.get_cmap("Blues"))
cmap.set_under("white")

def color_nan_white(val):
    """Color the nan text white"""
    if np.isnan(val):
        return 'color: white'

def color_nan_white_background(val):
     """Color the nan cell background white"""
    if np.isnan(val):
        return 'background-color: white'

然后将它们应用到我的数据框,再次借用@quant,为方便起见稍作修改:

(df.style
    .background_gradient(axis='index')
    .applymap(lambda x: color_nan_white(x))
    .applymap(lambda x: color_nan_white_background(x))
)

然后它完美地工作了。

于 2020-12-07T03:07:30.863 回答