如果我的数据框中有字符串列,即“Cabin”,包含如下所示的值:
train = pl.from_repr("""
┌───────┐
│ Cabin │
│ --- │
│ str │
╞═══════╡
│ B/0/P │
│ F/0/S │
│ A/0/S │
│ A/0/S │
│ F/1/S │
└───────┘
""")
我想知道将'Cabin'列拆分为多列的过程,如下所示:
shape: (5, 3)
┌─────┬─────┬─────┐
│ A ┆ B ┆ C │
│ --- ┆ --- ┆ --- │
│ str ┆ i8 ┆ str │
╞═════╪═════╪═════╡
│ B ┆ 0 ┆ P │
│ F ┆ 0 ┆ S │
│ A ┆ 0 ┆ S │
│ A ┆ 0 ┆ S │
│ F ┆ 1 ┆ S │
└─────┴─────┴─────┘
我通过
train.select(pl.col("Cabin").str.split(by="/")).to_series()
对列进行了初始分割操作得到
Series: 'Cabin' [list]
[
["B", "0", "P"]
["F", "0", "S"]
["A", "0", "S"]
["A", "0", "S"]
["F", "1", "S"]
]
所以我想知道下一步如何获得我想要的输出,如上所示。
你已经很接近了。您可以为此列表建立索引以创建新列,或者使用
split_exact
来创建 struct
。
>>> s = pl.Series("Cabin", ["B/0/P", "F/0/S", "A/0/S"])
>>> train = s.to_frame()
>>> train
shape: (3, 1)
┌───────┐
│ Cabin │
│ --- │
│ str │
╞═══════╡
│ B/0/P │
│ F/0/S │
│ A/0/S │
└───────┘
索引到列表(相应地添加更多表达式
get(1)
和get(2)
):
>>> train.with_columns(pl.col("Cabin").str.split("/").list.get(0))
shape: (3, 1)
┌───────┐
│ Cabin │
│ --- │
│ str │
╞═══════╡
│ B │
│ F │
│ A │
└───────┘
分割精确解:
>>> train.select(pl.col("Cabin").str.split_exact("/", 2)).unnest("Cabin")
shape: (3, 3)
┌─────────┬─────────┬─────────┐
│ field_0 ┆ field_1 ┆ field_2 │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞═════════╪═════════╪═════════╡
│ B ┆ 0 ┆ P │
│ F ┆ 0 ┆ S │
│ A ┆ 0 ┆ S │
└─────────┴─────────┴─────────┘