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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:27:24