如何在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
代码说明
- 日期列获取:两种方式都能自动识别所有日期列,新增日期列时无需修改代码;
- 循环设置样式:针对每个日期列单独指定
rows条件——pl.col(col) > pl.col("Upper Range")确保只高亮当前列中超过对应行Upper Range的单元格; - 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




