如何从 python-polars 中的字符串列中删除最后 N 个字符?

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

鉴于此数据框:

df = pl.DataFrame({"s": ["pear", None, "papaya", "dragonfruit"]})

我想删除最后 X 个字符,例如删除最后 2 个字符 从专栏。 这显然没有达到我想要的效果:

df.with_columns(   
    pl.col("s").str.slice(2).alias("s_sliced"),

)

我希望结果是:

shape: (4, 2)
┌─────────────┬──────────┐
│ s           ┆ s_sliced │
│ ---         ┆ ---      │
│ str         ┆ str      │
╞═════════════╪══════════╡
│ pear        ┆ pe       │
│ null        ┆ null     │
│ papaya      ┆ papa     │
│ dragonfruit ┆ dragonfru|  
python python-polars
3个回答
4
投票

您可以使用正则表达式

.str.replace

  • .
    匹配“单个字符”
  • $
    匹配“结束”
  • {N}
    准确匹配 N 次

意味着我们可以使用

..$
.{2}$

df.with_columns(   
    pl.col("s").str.replace(r"..$", "").alias("s_sliced"),
)
shape: (4, 2)
┌─────────────┬───────────┐
│ s           ┆ s_sliced  │
│ ---         ┆ ---       │
│ str         ┆ str       │
╞═════════════╪═══════════╡
│ pear        ┆ pe        │
│ null        ┆ null      │
│ papaya      ┆ papa      │
│ dragonfruit ┆ dragonfru │
└─────────────┴───────────┘

0
投票

非正则表达式的方式来做到这一点是相当丑陋的,但它是......

df.with_columns(
    s_sliced=(pl.col('s').str.explode().implode().over('s')
                .list.take(pl.arange(0,(pl.col('s').str.n_chars()-2))))
            .list.eval(pl.element().str.concat("")).list.get(0))

首先要注意的是,我们使用

str.explode.implode
将字符列转换为列表,这是因为
str.slice
不采用长度表达式,而
pl.arange
则采用。然后我们只需使用我们想要的元素,除了最后 2 个元素之外,最后,我们必须将列表转换回字符串。

** 使用简单的正则表达式有一个非常简洁的答案,但其作者删除了它,我不愿意复制它。也许该帖子的作者会取消删除它。


0
投票

0.20.21
开始,您可以使用
polars.Series.str.head
。根据文档:

n
输入为负数时,
head
返回直到
n
日 从字符串的末尾开始。例如,如果
n = -3
,则所有字符 除了最后三个被返回。

演示:

>>> import polars as pl
>>> 
>>> N = 2
>>> df = pl.DataFrame({"s": ["pear", None, "papaya", "dragonfruit"]})
>>> df
shape: (4, 1)
┌─────────────┐
│ s           │
│ ---         │
│ str         │
╞═════════════╡
│ pear        │
│ null        │
│ papaya      │
│ dragonfruit │
└─────────────┘
>>> df.with_columns(pl.col("s").str.head(-N).alias("new"))
shape: (4, 2)
┌─────────────┬───────────┐
│ s           ┆ new       │
│ ---         ┆ ---       │
│ str         ┆ str       │
╞═════════════╪═══════════╡
│ pear        ┆ pe        │
│ null        ┆ null      │
│ papaya      ┆ papa      │
│ dragonfruit ┆ dragonfru │
└─────────────┴───────────┘
© www.soinside.com 2019 - 2024. All rights reserved.