鉴于此数据框:
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|
.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 │
└─────────────┴───────────┘
非正则表达式的方式来做到这一点是相当丑陋的,但它是......
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.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 │
└─────────────┴───────────┘