如何用Polars原生功能高效生成多列值的唯一集合列?
解决方案
完全可以用Polars原生矢量化操作实现,避开map_elements带来的性能损耗,具体代码如下:
import polars as pl df = pl.DataFrame({ 'id': [1, 2, 3], 'attribute': [True, True, False], 'val1': ['A', 'A', 'A'], 'val2': ['A', 'A', 'B'], 'val3': ['A', 'B', 'C'], }) # 原生高效实现 df = df.with_columns( pl.concat_list('^val.*$').unique().alias('set') ) print(df)
说明
pl.concat_list('^val.*$'):通过正则匹配所有以val开头的列,将每行的这些列值合并为一个列表.unique():对每行的列表执行去重——这是Polars原生矢量化操作,比Python层面的set+list效率高得多.alias('set'):为新列命名
执行后输出结果(注:集合本身无序,去重后的列表顺序可能和原方法略有不同,但元素完全一致):
shape: (3, 6) ┌─────┬───────────┬──────┬──────┬──────┬─────────────┐ │ id ┆ attribute ┆ val1 ┆ val2 ┆ val3 ┆ set │ │ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │ │ i64 ┆ bool ┆ str ┆ str ┆ str ┆ list[str] │ ╞═════╪═══════════╪══════╪══════╪══════╪═════════════╡ │ 1 ┆ true ┆ A ┆ A ┆ A ┆ ["A"] │ │ 2 ┆ true ┆ A ┆ A ┆ B ┆ ["A", "B"] │ │ 3 ┆ false ┆ A ┆ B ┆ C ┆ ["A", "B", "C"] │ └─────┴───────────┴──────┴──────┴──────┴─────────────┘
如果需要固定顺序的去重列表,可以在unique()后追加.sort():
df = df.with_columns( pl.concat_list('^val.*$').unique().sort().alias('set') )
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

