如何将极坐标数据框中的一列内容拆分为多列

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

如果我的数据框中有字符串列,即“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"]
]

所以我想知道下一步如何获得我想要的输出,如上所示。

python dataframe data-science python-polars data-preprocessing
1个回答
3
投票

你已经很接近了。您可以为此列表建立索引以创建新列,或者使用

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       │
└─────────┴─────────┴─────────┘
© www.soinside.com 2019 - 2024. All rights reserved.