Polars分组聚合时合并嵌套列表并去重为逗号分隔字符串
Polars嵌套列表分组聚合去重转字符串解决方案
问题场景
现有Polars DataFrame结构如下:
import polars as pl df = pl.DataFrame({ "id": [1, 2, 1], "name": ['jenobi', 'blah', 'jenobi'], "company": [ [['some company 1', 'some company2'], ['some company2']], [['company 1'], ['company 2', 'company 3']], [['some company 1'], ['some company2', 'some company 1', 'some company 2']] ] })
需求
按id和name分组聚合,将company列的多层嵌套列表合并,去重后转换为逗号分隔的字符串(例如jenobi对应的结果应为"some company 1, some company2, some company 2")。
可行解决方案
针对嵌套列表的层级问题,分步处理扁平化、去重和字符串转换,可避免直接操作引发的格式错误或panic:
result = df.group_by(["id", "name"]).agg( pl.col("company") # 先扁平化每个二级嵌套子列表 .list.eval(pl.element().flatten()) # 将所有元素拉平为一维列表 .flatten() # 对列表元素去重 .unique() # 转换为逗号分隔的字符串 .list.join(", ") ) print(result)
执行结果
输出如下:
shape: (2, 3) ┌─────┬────────┬───────────────────────────────────────────┐ │ id ┆ name ┆ company │ │ --- ┆ --- ┆ --- │ │ i64 ┆ str ┆ str │ ╞═════╪════════╪═══════════════════════════════════════════╡ │ 1 ┆ jenobi ┆ some company 1, some company2, some company 2 │ │ 2 ┆ blah ┆ company 1, company 2, company 3 │ └─────┴────────┴───────────────────────────────────────────┘
关键步骤说明
list.eval(pl.element().flatten()):处理内层二级嵌套,先将每个子列表扁平化,避免直接flatten导致的层级混乱;.flatten():把处理后的多层列表拉平为一维,便于后续去重操作;.unique():对一维列表的元素去重;.list.join(", "):将去重后的列表转换为逗号分隔的目标字符串。
内容的提问来源于stack exchange,提问作者Jenobi
相关产品推荐
相关产品推荐

