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

Polars中按组聚合为列表的惯用方法是什么?

Polars分组收集列值为列表的最佳实践

问题背景

以下代码可实现分组后将列值收集为列表的功能,但写法繁琐且apply已被弃用:

import polars as pl

# 示例数据
df = pl.DataFrame({
    "group": ["A", "A", "B", "B", "C"],
    "values": [1, 2, 3, 4, 5]
})

# 用lambda函数分组并将值收集为列表
result = df.groupby("group").agg([
    pl.col("values").apply(lambda x: x.to_list()).alias("values_list")
])

print(result)

官方推荐的map_elements(lambda x:x.to_list(),return_dtype=object)写法体验更差。想直接使用pl.col("values").list()或pl.col("values").collect_list(),但在polars = "^0.20.19"版本中这两个方法均不存在。

问题

  1. 这是Polars实现该需求的惯用方式吗?(对应Pandas中使用list的操作)
  2. 是否有更优的实现方法?

回答

  1. 这绝对不是Polars的惯用方式。你当前用apply/map_elements的写法属于Python层面的逐组遍历,完全没利用Polars的向量化优势,性能拉胯,而且apply已经被弃用,属于过渡性写法,和Pandas里直接用list的原生聚合逻辑完全不是一个层级。

  2. 在Polars 0.20.x版本中,有更优的原生实现方法:使用agg_list(),这是官方推荐的分组收集列表的向量化API,不需要依赖Python lambda,写法简洁且性能拉满。

修改后的代码如下:

import polars as pl

df = pl.DataFrame({
    "group": ["A", "A", "B", "B", "C"],
    "values": [1, 2, 3, 4, 5]
})

# 原生向量化聚合写法
result = df.groupby("group").agg(
    pl.col("values").agg_list().alias("values_list")
)

print(result)

输出结果和原代码一致,但完全是Polars原生实现,既避开了弃用API,写法也更清爽。

补充说明:collect_list是Polars 0.21版本之后才重命名的方法,0.20.x版本对应的原生方法就是agg_list,这就是你找不到collect_list的原因。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:12:17