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

在Polars中group_by时如何高效聚合列表为单列表而非列表的列表?

Polars分组合并列表的高效实现方案

问题场景

给定如下Polars DataFrame:

import polars as pl

df = pl.DataFrame(
    {
        "Case": ["case1", "case1"],
        "List": [["x1", "x2"], ["x3", "x4"]],
    }
)

需要按Case字段分组,将每组内的列表合并(等价于Python的list.extend操作)。原尝试的方法在百万行级数据下性能极差,甚至导致系统崩溃,不具备可扩展性:

df.group_by("Case").agg(
    pl.col("List")
).with_columns(
    pl.col("List").list.eval(pl.element().explode()),
)

高效解决方案

使用Polars内置的list.concat方法,这是底层优化的向量式操作,直接在列层面完成列表合并,性能和可扩展性拉满:

df.group_by("Case").agg(
    pl.col("List").list.concat()
)

执行后得到预期结果:

shape: (1, 2)
┌───────┬──────────────────┐
│ Case  ┆ List             │
│ ---   ┆ ---              │
│ str   ┆ list[str]        │
╞═══════╪══════════════════╡
│ case1 ┆ ["x1", "x2", "x3", "x4"] │
└───────┴──────────────────┘

为什么原方法性能差

原方案中的list.eval(pl.element().explode())属于嵌套逐元素操作,会触发大量循环遍历,在大数据量下会导致内存占用激增、计算效率暴跌。而list.concat是Polars针对列表合并场景优化的原生方法,全程基于向量运算,避免了逐元素处理的额外开销。

补充说明

  • 之前提到的str.join方案属于临时 workaround,仅适用于字符串类型的列表,需要先拼接再拆分,通用性和效率都不如list.concat。
  • Pandas中df.groupby("Case").agg(sum)写法简单,但性能远不如Polars的list.concat,尤其在百万行以上的大数据场景下差距显著。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:55:14