在 Polars 中对列表列进行分组聚合时,若需将多行列表扁平合并为单个一维列表(而非嵌套列表),应先使用 explode() 展开列表元素,再通过 agg() 聚合,而非直接对列表列调用 agg()。
在 polars 中对列表列进行分组聚合时,若需将多行列表**扁平合并为单个一维列表**(而非嵌套列表),应先使用 `explode()` 展开列表元素,再通过 `agg()` 聚合,而非直接对列表列调用 `agg()`。
当使用 df.group_by('id').agg("name") 时,Polars 默认将每行的列表作为整体收集,形成嵌套结构(如 [["Bob"], ["Mary", "Sue"]])。这并非真正的“连接”,而是列表的列表。要实现语义上的列表拼接(concatenation),关键在于:先打散(explode),再聚合(agg)。
explode() 会将每行中的列表展开为多行(保留其他列值),使每个字符串元素成为独立行;随后 agg() 对这些展开后的元素统一收集为一个新列表——这正是所需的扁平化结果。
✅ 正确做法如下:
import polars as pl
df = pl.DataFrame({
'id': [1, 1],
'name': [["Bob"], ["Mary", "Sue"]],
})
result_df = df.group_by('id').agg(pl.col('name').explode())
print(result_df)输出:
shape: (1, 2) ┌─────┬─────────────────────────┐ │ id ┆ name │ │ --- ┆ --- │ │ i64 ┆ list[str] │ ╞═════╪═════════════════════════╡ │ 1 ┆ ["Bob", "Mary", "Sue"] │ └─────┴─────────────────────────┘
⚠️ 注意事项:
- explode() 会增加行数(本例中从 2 行 → 3 行),但后续 group_by(...).agg() 会将其重新压缩为每组一行,因此最终结果维度正确;
- 若原始数据中存在 null 列表(如 None 或空列表 []),explode() 会自动跳过 None,并将空列表展开为零行(即不贡献任何元素),行为安全;
- 此方法适用于任意可嵌套类型(如 list[int], list[struct]),只要底层元素类型一致,聚合后仍保持类型推断正确。
总结:Polars 不提供内置的 concat_list() 聚合函数(如 Spark 的 flatten + collect_list),但 explode() + agg() 组合是标准、高效且语义清晰的替代方案,应作为列表拼接聚合的首选模式。

















