如何在Polars中实现类似Pandas groupby的有序分组遍历
Polars 固定 group_by 遍历顺序的原生实现
Polars 默认不保证 group_by 的遍历顺序是面向性能的设计,不需要手动写循环过滤、拼元组排序,原生参数即可实现和 Pandas 一致的有序分组效果。
首选方案:使用 maintain_order=True 参数
Polars 0.19.0 及以上版本的 group_by 内置 maintain_order 参数,设为 True 时会严格按照分组键在排序后原表中首次出现的顺序返回分组结果,性能远高于手动实现的方案:
# 先按业务逻辑排序 df_sorted = df.sort("date", "grouping_column") # 开启顺序保持后,遍历行为和Pandas完全一致:返回(分组键值, 子DataFrame)元组,顺序固定 for group_key, sub_df in df_sorted.group_by("grouping_column", maintain_order=True): # 直接编写Plotly绘图逻辑即可,输出顺序稳定 pass
该参数仅控制输出顺序,不会引入过多额外性能开销。
自定义固定分组顺序场景
如果需要完全自定义分组顺序(比如固定Plotly图例的展示顺序),可以先将分组键转为指定顺序的Enum类型,再配合maintain_order=True实现:
import polars as pl # 自定义分组的固定展示顺序 fixed_group_order = ["产品线A", "产品线B", "产品线C"] df = df.with_columns( pl.col("grouping_column").cast(pl.Enum(fixed_group_order)) ) # 遍历顺序严格匹配自定义的固定顺序 for group_key, sub_df in df.group_by("grouping_column", maintain_order=True): # 绘图逻辑 pass
现有手动方案的缺陷
- 循环
unique+filter方案:每次过滤都会触发全表扫描,数据量越大性能损耗越明显,不推荐使用 - 手动生成(分组键, 子DataFrame)元组再排序方案:需要先将全部分组加载到内存生成列表,再做二次排序,大数据集下内存占用高、写法冗余,无必要使用
内容的提问来源于stack exchange,提问作者supersick
相关产品推荐
相关产品推荐

