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

