Polars DataFrame 展示样式指南:用 `DataFrame.style` 与 Great Tables 生成专业排版表格
2026/9/10 13:54:24 网站建设 项目流程

Polars DataFrame 展示样式指南:用DataFrame.style与 Great Tables 生成专业排版表格

【免费下载链接】polarsExtremely fast Query Engine for DataFrames, written in Rust项目地址: https://gitcode.com/GitHub_Trending/po/polars

DataFrame.style是 Polars Python API 中用于表格展示样式化的入口属性:Polars 自身不实现任何样式逻辑,而是将 DataFrame 实例直接交给开源包 Great Tables(GT)继续构造,最终生成可直接在 Notebook 中渲染、可导出为 HTML 的精美表格。读完本文,你将掌握.style的依赖安装方式、它与底层 GT 对象的调用关系,以及如何用tab_stub/tab_style/tab_spanner/fmt_number等组合完成“行名标识 + 条件高亮 + 列分组 + 数值格式化”的完整实战。

一、DataFrame.style是什么

在 Polars 的 DataFrame 参考文档目录中,样式能力对应独立页面 style.rst,其中只有一个核心 API——autoproperty:: DataFrame.style。它由 index.rst 的 toctree 收录,与aggregationgroup_byplot等页面并列,构成完整的 DataFrame API 参考。

该属性的官方定义与示例位于 frame.py,核心定位有三点:

  1. 只负责"入口":调用df.style时 Polars 不做样式渲染,而是返回一个 Great Tables 的GT对象;
  2. 功能完全委托:文档明确说明 "Polars does not implement styling logic itself, but instead defers to the Great Tables package",即后续所有样式能力都由great_tables提供;
  3. 当前标记为 unstable:该功能被@unstable()装饰器标注,未来可能在不视为破坏性变更的前提下调整,详见下文"稳定性说明"。
@property @unstable() def style(self) -> GT: """Create a Great Table for styling.""" if not _GREAT_TABLES_AVAILABLE: msg = "great_tables is required for `.style`" raise ModuleNotFoundError(msg) return great_tables.GT(self)

从源码可以确认调用链非常简单直接:DataFrame.stylegreat_tables.GT(self),返回类型GT仅在类型检查时从great_tables导入(frame.py)。

二、安装与依赖前置

因为.style依赖第三方包 Great Tables,使用前必须确保环境满足以下任一安装方式(当前仓库要求版本为great-tables >= 0.8.0,见 pyproject.toml):

# 方式一:安装官方 style extra(推荐) pip install 'polars[style]' # 方式二:显式安装底层包 pip install 'great-tables>=0.8.0'

仓库还提供了两类"全家桶"路径:

  • 在 pyproject.toml 中,styleextra 已被并入polars[all],因此pip install 'polars[all]'同样可用.style
  • 作为开发者环境依赖,requirements-dev.txt 同样锁定great-tables>=0.8.0

懒加载与缺失报错机制

Polars 不会在import polars时同步加载 Great Tables。在 _dependencies.py 中,great_tables通过_lazy_import按需导入,并生成可用性标志:

great_tables, _GREAT_TABLES_AVAILABLE = _lazy_import("great_tables")

DataFrame.style在每次被访问时都会检查该标志(对应源码中的if not _GREAT_TABLES_AVAILABLE);若未安装,会抛出ModuleNotFoundError,提示信息为:

great_tables is required for `.style`

这种设计带来的直接收益是:不装great_tables时,Polars 其余功能不受任何影响,导入与执行零额外开销。

三、快速上手:从 DataFrame 到 GT 对象

.style的返回值是一个GT对象。GT 采用"构建器"式(每次调用返回新对象)的风格,因此你可以把.style理解为一次从 Polars DataFrame 到展示表格世界的类型切换。官方示例数据如下:

import polars.selectors as cs from great_tables import loc, style df = pl.DataFrame( { "site_id": [0, 1, 2], "measure_a": [5, 4, 6], "measure_b": [7, 3, 3], } )

一个常见的"报表排版"需求可以这样组合完成:

# 1) 将 site_id 列提升为行名(stub),左列结构更接近"报表"语义 gt = df.style.tab_stub(rowname_col="site_id") # 2) 为 measure_a 最大的那一行填充黄色背景 gt = gt.tab_style( style.fill("yellow"), loc.body(rows=pl.col("measure_a") == pl.col("measure_a").max()), ) # 3) 为所有 measure 开头的列添加一个高层分组标签(spanner) gt = gt.tab_spanner("Measures", cs.starts_with("measure")) # 4) 将 measure_b 格式化为两位小数 gt = gt.fmt_number("measure_b", decimals=2)

上述每一步都可在 REPL / Notebook 中单独调用并即时预览,也建议每次单独执行便于观察效果。该完整示例正是 DataFrame.style 官方 docstring 所演示的用法。

四、四个高频样式的逐项拆解

4.1tab_stub:把普通列变成行名

df.style.tab_stub(rowname_col="site_id")

tab_stub会将某一列从"数据体"中抽出,渲染成左侧的行标识列(stub),常用于把 ID、指标名等从数值区剥离,形成报表式布局。

4.2tab_style+loc.body:表达式驱动的条件高亮

df.style.tab_style( style.fill("yellow"), loc.body(rows=pl.col("measure_a") == pl.col("measure_a").max()), )

这是最有 Polars 特色的部分:loc.body(rows=...)的目标行选择直接接受Polars 表达式,因此你可以复用整个 Polars 表达式生态来做条件定位——最大值行、满足区间过滤的行、分组内 Top-N 等,都可以用pl.col(...)表达,而无需像部分工具那样手工计算行号索引。需要理解的是:

  • style.fill("yellow")来自great_tables.style命名空间,描述"应用的样式";
  • loc.body(rows=...)来自great_tables.loc命名空间,描述"样式作用的位置";
  • 目标行由 Polars 表达式求值得到,这是两者互操作的关键桥梁。

4.3tab_spanner+ selectors:多列分组

df.style.tab_spanner("Measures", cs.starts_with("measure"))

tab_spanner会在一组列上方绘制跨列的分组标签(spanner)。第二参数不仅可以是列名列表,也可以直接传入Polars 选择器polars.selectors,上文cs即为其别名)。cs.starts_with("measure")会同时选中measure_ameasure_b,从而自动将这两列归入 "Measures" 分组。

4.4fmt_number:数值格式化

df.style.fmt_number("measure_b", decimals=2)

fmt_number用于控制数值列的展示格式,例如decimals指定小数位数。GT 还提供货币、百分比、科学计数法等更多格式化入口,都属于great_tables包自身的能力范围,具体可查阅 Great Tables 官方参考文档。

五、GT 对象的进一步输出

拿到GT对象后,你可以借助该包自身的 API 做最终呈现,常见出口包括:

# 渲染为 HTML 字符串(可用于嵌入网页或邮件) html_str = gt.as_raw_html() # 在 Notebook 中直接显示 gt

GT 同样支持导出图片等更丰富的表示层能力。需要注意的是:一旦.style返回GT,后续链式调用(.tab_style.fmt_number.as_raw_html等)全部发生在Great Tables 对象上,而不再是 Polars DataFrame——不要把两者 API 混用。

六、unstable 标记与运行时警告

由于.style当前被认为是不稳定功能("It may be changed at any point without it being considered a breaking change"),frame.py 中该属性同时叠加了@property@unstable()装饰器。装饰器的实现位于 unstable.py:

def unstable() -> IdentityFunction: """Decorator to mark a function as unstable.""" def decorate(function): @wraps(function) def wrapper(*args, **kwargs): issue_unstable_warning(f"`{function.__name__}` is considered unstable.") return function(*args, **kwargs) return wrapper return decorate

关键细节是:默认情况下该警告不会触发。issue_unstable_warning 只有显式开启后才发出UnstableWarning

warnings_enabled = bool(int(os.environ.get("POLARS_WARN_UNSTABLE", 0))) if not warnings_enabled: return

也就是说,.style可以被正常使用而不产生任何噪音;只有当你设置环境变量POLARS_WARN_UNSTABLE=1(等价于开启Config.warn_unstable)时,访问该属性才会收到“该功能不稳定、可能随时变更”的提示,帮助你提前感知潜在 API 变动风险。

七、使用建议与边界

  • 把它当"展示层",不要当"数据处理层".style输出的 GT 对象面向人的阅读与汇报场景;需要继续做聚合、过滤、Join 等计算时,请回到原始 DataFrame 操作,完成后再调用.style
  • 保持额外依赖的显式声明:在部署或 CI 环境,务必通过polars[style]great-tables>=0.8.0声明依赖,避免出现ModuleNotFoundError: great_tables is required for .style
  • 留意 unstable 语义:版本升级后若样式 API 出现调整,按官方定义这不算破坏性变更,生产环境中应对相关代码段做版本锁定并观察变更日志;
  • 查阅范围:更丰富的样式(fmt_*系列、tab_options等)属于 Great Tables 包自身的文档范畴,Polars 侧入口与示例均以上述.styledocstring 与本文列举的组合为准。

从实现层面回看:.style是 Polars 把“高性能数据引擎”与“专业排版生态”连接起来的一个精巧入口——引擎负责计算,渲染交给专业工具,双方通过great_tables.GT(self)一行代码完成互操作,这正是该 API 设计的精髓所在。

【免费下载链接】polarsExtremely fast Query Engine for DataFrames, written in Rust项目地址: https://gitcode.com/GitHub_Trending/po/polars

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询