You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars的LazyFrame阶段查看字段的排序标志?

问题背景

示例代码如下:

from datetime import date
import polars as pl

df = pl.LazyFrame({'a': [date(2020, 1, 1), date(2020, 1, 3), date(2020, 1, 2)]})
df = df.sort('a')

将该LazyFrame物化后,可查看字段的排序标志:

In [31]: df.collect()['a'].flags
Out[31]: {'SORTED_ASC': True, 'SORTED_DESC': False}

此时能确认Polars已识别字段a为升序排序。由于刚执行了.sort('a')操作,推测Polars在LazyFrame阶段就已记录该字段的排序状态,请问是否有方法在LazyFrame阶段直接查看字段的排序标志?


解决方案

目前Polars没有直接暴露LazyFrame字段排序状态的公开API,但可以通过解析逻辑计划间接获取这类信息:

方法1:查看逻辑计划字符串

调用.describe_plan()打印逻辑计划,从中可看到排序相关操作:

print(df.describe_plan())

输出示例:

SORT BY [a]
  DF ["a"]; PROJECT */1 COLUMNS

从输出能明确字段a是排序依据,但不会直接给出SORTED_ASC这类标志。

方法2:程序化解析逻辑计划(进阶)

通过.logical_plan属性获取逻辑计划对象,递归遍历节点提取排序信息:

def get_sorted_columns(lf: pl.LazyFrame) -> list[tuple[str, bool]]:
    sorted_cols = []
    plan = lf.logical_plan

    def traverse(node):
        # 识别排序节点
        if hasattr(node, 'sort_by'):
            for expr in node.sort_by:
                col_name = expr.name()
                # is_reversed()返回True表示降序,反之升序
                is_ascending = not expr.is_reversed()
                sorted_cols.append((col_name, is_ascending))
        # 递归处理子节点
        if hasattr(node, 'input'):
            traverse(node.input)
        elif hasattr(node, 'inputs'):
            for input_node in node.inputs:
                traverse(input_node)
    
    traverse(plan)
    return sorted_cols

# 使用示例
print(get_sorted_columns(df))
# 输出: [('a', True)]

注意:.logical_plan属于Polars内部API,后续版本可能存在变动。

补充说明

Polars的LazyFrame确实会在逻辑计划阶段跟踪排序状态(用于优化后续分组、连接等操作),但目前未将这类状态封装为简洁的公开查询接口,因此只能通过解析逻辑计划的方式间接获取。


内容的提问来源于stack exchange,提问作者ignoring_gravity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:02:24