如何在Python-polars中移除字符串列的最后N个字符?
Polars移除字符串列最后N个字符的正确实现
给定如下Polars DataFrame:
df = pl.DataFrame({"s": ["pear", None, "papaya", "dragonfruit"]})
需要移除列s中每个字符串的最后2个字符,但使用str.slice(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.slice(2)的作用是从字符串的**第2个索引位置(从0开始计数)**截取到末尾,而不是移除最后2个字符,这和需求完全相反。
正确解法
方法1:使用负数长度参数
Polars的str.slice支持负数长度,表示截取到倒数第N个字符为止,直接写长度为-2即可:
df.with_columns( pl.col("s").str.slice(length=-2).alias("s_sliced") )
也可以明确指定起始索引为0,效果一致:
df.with_columns( pl.col("s").str.slice(0, -2).alias("s_sliced") )
方法2:基于字符串长度计算截取长度
先通过str.lengths()获取每个字符串的长度,再减去要移除的字符数,作为截取的长度:
df.with_columns( pl.col("s").str.slice(0, pl.col("s").str.lengths() - 2).alias("s_sliced") )
这种方式更灵活,适合需要动态调整移除字符数的场景,同时会自动保留原列的null值。
两种方法都能输出符合预期的结果,并且不会影响原列的null值。
内容的提问来源于stack exchange,提问作者nos
相关产品推荐
相关产品推荐

