如何在Polars数据框中对字符串从右侧拆分n次(模拟Pandas rsplit)
在Polars中模拟Pandas的rsplit行为
你需要从字符串列的右侧拆分指定次数的内容,比如示例中用Pandas的str.rsplit("_", n=2, expand=True)实现的效果:
import polars as pl import pandas as pd df = pl.DataFrame( { "name": [ "some_name_set_1", "some_name_set_1b", "some_other_name_set_2", "yet_another_name_set_2", ] } ) # Pandas的实现效果 print(df.to_pandas()["name"].str.rsplit("_", n=2, expand=True))
输出:
0 1 2 0 some_name set 1 1 some_name set 1b 2 some_other_name set 2 3 yet_another_name set 2
Polars没有直接对应的rsplit表达式,可通过以下几种方式模拟该行为:
方法一:反转字符串 + 拆分 + 再次反转
核心思路是先反转字符串,用str.split从左侧拆分指定次数,再将拆分后的每个部分反转回来,最后调整列顺序:
result = df.with_columns( # 反转字符串后按"_"拆分2次 pl.col("name").str.reverse().str.split("_", n=2).alias("split_parts") ).with_columns( # 拆分后的各部分重新反转,对应原字符串的拆分结果 pl.col("split_parts").arr.get(2).str.reverse().alias("col0"), pl.col("split_parts").arr.get(1).str.reverse().alias("col1"), pl.col("split_parts").arr.get(0).str.reverse().alias("col2") ).drop("split_parts") print(result)
输出:
shape: (4, 4) ┌────────────────────┬─────────────────┬─────┬─────┐ │ name ┆ col0 ┆ col1┆ col2│ │ --- ┆ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str ┆ str │ ╞════════════════════╪═════════════════╪═════╪═════╡ │ some_name_set_1 ┆ some_name ┆ set ┆ 1 │ │ some_name_set_1b ┆ some_name ┆ set ┆ 1b │ │ some_other_name_set_2 ┆ some_other_name ┆ set ┆ 2 │ │ yet_another_name_set_2 ┆ yet_another_name ┆ set ┆ 2 │ └────────────────────┴─────────────────┴─────┴─────┘
方法二:正则表达式提取
通过正则匹配直接捕获最后两个下划线分隔的三部分,一次性拆分出目标内容:
result = df.with_columns( pl.col("name").str.extract(r"^(.*)_(.*)_(.*)$", group=[1,2,3]).alias("split_parts") ).unnest("split_parts").rename({"1": "col0", "2": "col1", "3": "col2"}) print(result)
输出与方法一完全一致。
方法三:嵌套使用str.rpartition(适合拆分次数少的场景)
Polars的str.rpartition可以从右侧拆分1次,嵌套使用即可实现多次拆分:
result = df.with_columns( # 第一次从右侧拆分,得到前半部分、分隔符、最后一部分 pl.col("name").str.rpartition("_").alias("first_split") ).with_columns( # 对前半部分再次从右侧拆分 pl.col("first_split").arr.get(0).str.rpartition("_").alias("second_split") ).with_columns( col0=pl.col("second_split").arr.get(0), col1=pl.col("second_split").arr.get(2), col2=pl.col("first_split").arr.get(2) ).drop("first_split", "second_split") print(result)
同样可以得到预期的拆分结果。
内容的提问来源于stack exchange,提问作者blaylockbk
相关产品推荐
相关产品推荐

