如何使用 Polars.concat_str 组合正则表达式选择的多个列?

问题描述 投票:0回答:2

我在将列合并为一列时遇到问题。假设我有一个如下所示的数据框(df):

>> print(df)

shape: (3, 4)
┌─────┬───────┬───────┬───────┐
│ a   ┆ b_a_1 ┆ b_a_2 ┆ b_a_3 │
│ --- ┆ ---   ┆ ---   ┆ ---   │
│ i64 ┆ str   ┆ str   ┆ str   │
╞═════╪═══════╪═══════╪═══════╡
│ 1   ┆ a--   ┆       ┆       │
├╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ 1   ┆       ┆ b--   ┆       │
├╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│ 1   ┆       ┆       ┆ c--   │
└─────┴───────┴───────┴───────┘

我希望能够使用 python-polars 将最后三 (3) 列合并为一列。我已经尝试并成功得到了我想要的。然而,

>> out = df.select(pl.concat_str(['b_a_1', 'b_a_2', 'b_a_3']).alias('b_a'))
>> print(out)

shape: (3, 1)
┌─────┐
│ b_a │
│ --- │
│ str │
╞═════╡
│ a-- │
├╌╌╌╌╌┤
│ b-- │
├╌╌╌╌╌┤
│ c-- │
└─────┘

当我使用正则表达式选择列时,我没有得到上述结果

>> out = df.select(pl.concat_str('^b_a_\d$'))
>> print(out)

shape: (3, 3)
┌───────┬───────┬───────┐
│ b_a_1 ┆ b_a_2 ┆ b_a_3 │
│ ---   ┆ ---   ┆ ---   │
│ str   ┆ str   ┆ str   │
╞═══════╪═══════╪═══════╡
│ a--   ┆       ┆       │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│       ┆ b--   ┆       │
├╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌┤
│       ┆       ┆ c--   │
└───────┴───────┴───────┘

运行时什么也没有

>> out = df.select(pl.concat_str('^b_a_*$'))
>> print(out)

shape: (0, 0)
┌┐
╞╡
└┘

如何使用正则表达式选择列并将它们合并为一列?

非常感谢您的时间和建议。

真诚的, 蒂安

python python-polars
2个回答
2
投票

由于 polars.concat_str 在将 str 与 null 连接时的

当前行为
是输出 null,因此可能的解决方法是使用
.fill_null
,在相关列上将 Null 替换为空字符串。

(
df.select([
    pl.concat_str(
        pl.col("^b_a_\d$").fill_null("").alias("b_a")
        )
    ])
)

shape: (3, 1)
┌─────┐
│ b_a │
│ --- │
│ str │
╞═════╡
│ a-- │
├╌╌╌╌╌┤
│ b-- │
├╌╌╌╌╌┤
│ c-- │
└─────┘

0
投票

自上次回答以来,

pl.concat_str
扩展了与输入中的正则表达式匹配的列。此外,
pl.concat_str
接受参数
ignore_nulls=True
以忽略任何空值。

df.select(pl.concat_str(pl.col("^b_a_\d$"), ignore_nulls=True))
shape: (3, 1)
┌───────┐
│ b_a_1 │
│ ---   │
│ str   │
╞═══════╡
│ a--   │
│ b--   │
│ c--   │
└───────┘
© www.soinside.com 2019 - 2024. All rights reserved.