如何在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
相关产品推荐
相关产品推荐

