使用百分位数为数据框单元格着色背景

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

所以我有一个时间序列数据框 df,它有“n”列和大量行:

df = pd.read_csv('percentiles.csv', index_col=0, parse_dates=True)

df 的最后 3 行看起来像这样:

ATH ATL 12MH 12ML 3MH 3ML 1MH 1ML
日期
2024-02-16 6 0 8 -1 11 -8 15 -16
2024-02-19 8 -1 10 -2 11 -5 22 -11
2024-02-20 8 0 13 0 16 -2 40 -3

我正在尝试将此 df 导出为表格(pdf),单元格的背景颜色取决于其列中值的高低。我发现的一种方法是使用百分号。

我制作了另一个数据框,以确定每列的百分位数:

percentiles = [0, 0.1, 0.2, 0.8, 0.9]
df2 = df.quantile(q=percentiles, axis=0)

df2,包含每列的百分位数值,如下所示:

ATH ATL 12MH 12ML 3MH 3ML 1MH 1ML
0.0 0.0 -115.0 0.0 -74.0 0.0 -122.0 0.0 -136.0
0.1 0.0 -8.0 0.0 -8.0 1.0 -26.1 4.0 -44.1
0.2 1.8 -4.0 1.0 -4.0 3.0 -14.0 7.0 -28.0
0.8 10.0 0.0 11.0 0.0 20.0 -1.0 33.0 -4.0
0.9 15.0 0.0 16.0 0.0 29.0 0.0 44.1 -2.0

我制作了一本字典,为每个百分位数指定颜色:

percentile_color = {0:'red', 0.1: 'orange', 0.2: 'white', 0.8: 'lightgreen', 0.9: 'green'}

我想用该列的百分位数颜色为每列中的每个单元格着色。我可以对一系列(列)执行此操作,但是一旦我制作了数据框,其中每列都有不同的百分位数值,我就陷入困境。有什么建议么?谢谢!

python pandas loops background-color percentile
1个回答
0
投票

您可以将

styler.apply
与使用
quantile
merge_asof
:

的自定义函数一起使用
def get_colors(s):
    s = s.astype(float).sort_values()
    return (pd.merge_asof(s.reset_index(), s.quantile(q=percentiles).reset_index())
              .set_index('Date')['index']
              .map(lambda x: f'background-color: {percentile_color.get(x, "")}')
           )

df.style.apply(get_colors)

输出:

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