You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Great Tables中实现条件格式化:高亮日期列中大于Upper Range的单元格

如何在Great Tables中实现条件格式化:高亮日期列中大于Upper Range的单元格

我来帮你搞定这个Great Tables的条件格式化问题!你想要高亮所有日期列中超过对应行Upper Range的单元格,而且日期列是动态的不能硬编码,对吧?

核心思路

每个日期列需要和同一行的Upper Range值单独比较,所以循环处理每个日期列是最可靠的方案——这样能精确指定每个列的高亮规则,避免Great Tables无法识别批量列的比较条件。

完整实现代码

import polars as pl
from great_tables import GT, style, loc
import polars.selectors as cs

# 1. 准备你的数据
gt_sample_df = pl.DataFrame({
    'Test': ['Test A','Test B','Test C','Test D','Test Z','Test E','Test F','Test X',
             'Test G','Test H','Test I','Test J'],
    'Lower Range': [35.3,2.5,85.0,0.0,None,3.0,200.0,None,3.0,400.0,None,7.0],
    'Upper Range': [79.5,3.5,150.0,160.0,160.0,5.0,None,200.0,5.0,1000.0,150.0,30.0],
    '2024-11-10': [43.0,3.14,135.82,162.7,None,None,206.0,None,4.76,519.52,134.4,26.88],
    '2024-08-03': [36.0,4.31,152.98,None,175.5,5.94,None,211.0,None,512.08,112.6,22.52],
    '2024-06-17': [47.0,3.38,158.94,None,182.0,4.87,None,229.0,None,550.24,115.3,23.06],
    '2024-02-01': [44.0,3.12,136.84,None,154.1,4.51,None,198.0,None,465.04,86.3,17.26],
    '2023-10-16': [45.0,3.11,140.14,None,162.0,4.6,None,207.0,None,501.44,109.3,21.86],
    '2023-05-15': [42.0,3.8,159.58,None,192.0,5.57,None,234.0,None,597.68,162.1,32.42]
})

# 2. 动态获取所有日期列
# 方式一:排除前三列
# date_columns = gt_sample_df.select(pl.exclude(["Test", "Lower Range", "Upper Range"])).columns
# 方式二:匹配以20开头的日期列(更精准)
date_columns = gt_sample_df.select(cs.starts_with("20")).columns

# 3. 初始化表格并批量应用条件格式
gt_table = GT(gt_sample_df)
for col in date_columns:
    gt_table = gt_table.tab_style(
        # 设置高亮样式:文字深蓝,填充浅蓝
        style=[style.text(color="Navy"), style.fill(color="PaleTurquoise")],
        # 指定作用位置:当前日期列中,值大于同一行Upper Range的单元格
        locations=loc.body(
            columns=col,
            rows=pl.col(col) > pl.col("Upper Range")
        )
    )

# 渲染表格
gt_table

代码说明

  1. 日期列获取:两种方式都能自动识别所有日期列,新增日期列时无需修改代码;
  2. 循环设置样式:针对每个日期列单独指定rows条件——pl.col(col) > pl.col("Upper Range")确保只高亮当前列中超过对应行Upper Range的单元格;
  3. None值处理:数据中的None会被自动忽略,不会触发高亮规则,符合业务逻辑。

你之前尝试的问题点

  • pl.col(lambda x: x) > pl.col('Upper Range')无法让Great Tables关联每个列与Upper Range的对应关系,导致条件不生效;
  • Great Tables的loc.body不支持Python切片语法(比如columns=[3:]),必须用Polars的选择器或列名列表来指定列。

运行这段代码后,就能得到你期望的效果:所有符合条件的单元格都会被高亮,而且完全适配动态的日期列。

备注:内容来源于stack exchange,提问作者ViSa

火山引擎 最新活动