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"版本中这两个方法均不存在。
问题
- 这是Polars实现该需求的惯用方式吗?(对应Pandas中使用
list的操作) - 是否有更优的实现方法?
回答
这绝对不是Polars的惯用方式。你当前用
apply/map_elements的写法属于Python层面的逐组遍历,完全没利用Polars的向量化优势,性能拉胯,而且apply已经被弃用,属于过渡性写法,和Pandas里直接用list的原生聚合逻辑完全不是一个层级。在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
相关产品推荐
相关产品推荐

