Polars分组后如何将多列合并为去重的单一列表?
Polars分组后合并多列去重值为单列表
现有如下Polars DataFrame:
import polars as pl df = pl.DataFrame({ "small": ["Apple Inc.", "Baidu Inc.", "Chevron Global", "Chevron Global", "Apple Inc."], "person": [10, 20, 30, 10, 10], "comp_big": ["Apple", "Baidu", "Chevron", "Chevron", "Apple"] })
如果按person分组后直接对small和comp_big取唯一值,会得到两个独立列表。要将这两列的去重值合并成单个列表,最直接高效的方式是在聚合时先拼接两列数组,再去重:
result = ( df .group_by("person") .agg( pl.concat([pl.col("small"), pl.col("comp_big")]).unique() ) ) print(result)
代码说明
pl.concat([pl.col("small"), pl.col("comp_big")]):将同一分组下small和comp_big的所有值拼接成一个一维数组.unique():对拼接后的数组去重,得到合并后的唯一值列表
执行后输出结果:
shape: (3, 2) ┌────────┬───────────────────────────────────────────┐ │ person ┌───────────────────────────────────────────┐ │ --- │ --- │ │ i64 │ list[str] │ ╞════════╪═══════════════════════════════════════════╡ │ 10 │ ["Apple Inc.", "Chevron Global", "Apple", │ │ │ "Chevron"] │ ├────────┼───────────────────────────────────────────┤ │ 20 │ ["Baidu Inc.", "Baidu"] │ ├────────┼───────────────────────────────────────────┤ │ 30 │ ["Chevron Global", "Chevron"] │ └────────┴───────────────────────────────────────────┘
补充:拼接后拆分的方式(不推荐)
如果一定要用管道符拼接再拆分的方式实现,也可以这么写,但这种方法涉及多次字符串操作,效率远低于直接数组拼接:
result_alt = ( df .group_by("person") .agg( (pl.col("small") + "|" + pl.col("comp_big")).flatten().str.split("|").flatten().unique() ) )
内容的提问来源于stack exchange,提问作者Jenobi
相关产品推荐
相关产品推荐

