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

Polars中如何以O(n)时间实现分组列值连续及组内指定排序?

关于Polars中DataFrame行重排的O(n)复杂度实现问题

核心需求

  • 对DataFrame行进行重排,满足以下要求:
    1. 指定列(如col1)值相同的行连续排列,不关心该列的具体排序顺序,目标是将时间复杂度从常规排序的O(nlogn)降至O(n)
    2. 扩展场景:支持多列规则——前M列仅需保证同值行连续(任意顺序),后N-M列按标准顺序排序,避免常规排序对前M列做不必要的有序性计算

实际场景示例

城市年度人口数据集(格式:Date, String, Int),要求同一城市的行连续且按年份排序,但不关心城市间的先后顺序

理论上通过哈希分组可实现O(n)复杂度,需验证Polars内置操作是否比常规排序更高效。


测试结果补充

场景1:仅实现分组行(M=1, N=2,1000万行,平均每组10行)

方法耗时排名
SORT0.26s2
EXPLODE0.22s1
PARTITION3.89s3

各方法说明:

  • SORT:df.sort(["col1", "col2"])
  • EXPLODE:df.group_by("col1").all().explode(pl.exclude("col1"))
  • PARTITION:pl.concat(df.partition_by("col1"))

场景2:分组且组内按第二列排序(M=1, N=2,100万行,平均每组10行)

方法耗时排名
SORT0.03s1
PARALLELPARTITION1.49s2
PARTITION5.05s3

各方法说明:

  • SORT:df.sort(["col1", "col2"])
  • PARTITION:pl.concat([x.sort('col2') for x in df.partition_by("col1")])
  • PARALLELPARTITION:pl.concat([x.lazy().sort('col2') for x in df.partition_by("col1")]).collect()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:13:18