所以我有一个时间序列数据框 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'}
我想用该列的百分位数颜色为每列中的每个单元格着色。我可以对一系列(列)执行此操作,但是一旦我制作了数据框,其中每列都有不同的百分位数值,我就陷入困境。有什么建议么?谢谢!
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)
输出: