扩展`polars`中的结构列列表

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

我有一个

pl.DataFrame
,其中有一列是由
list
条目组成的
struct
。列表的长度可能不同:

pl.DataFrame(
    {
        "id": [1, 2, 3],
        "s": [
            [
                {"a": 1, "b": 1},
                {"a": 2, "b": 2},
                {"a": 3, "b": 3},
            ],
            [
                {"a": 10, "b": 10},
                {"a": 20, "b": 20},
                {"a": 30, "b": 30},
                {"a": 40, "b": 40},
            ],
            [
                {"a": 100, "b": 100},
                {"a": 200, "b": 200},
                {"a": 300, "b": 300},
                {"a": 400, "b": 400},
                {"a": 500, "b": 500},
            ],
        ],
    }
)

看起来像这样:

shape: (3, 2)
┌─────┬─────────────────────────────────┐
│ id  ┆ s                               │
│ --- ┆ ---                             │
│ i64 ┆ list[struct[2]]                 │
╞═════╪═════════════════════════════════╡
│ 1   ┆ [{1,1}, {2,2}, {3,3}]           │
│ 2   ┆ [{10,10}, {20,20}, … {40,40}]   │
│ 3   ┆ [{100,100}, {200,200}, … {500,… │
└─────┴─────────────────────────────────┘

我尝试过各种版本的

unnest
explode
,但我无法将其变成一个长的
pl.DataFrame
,其中
list
变成行,
struct
条目变成列。这就是我想看到的:

pl.DataFrame(
        {
            "id": [1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3],
            "a": [1, 2, 3, 10, 20, 30, 40, 100, 200, 300, 400, 500],
            "b": [1, 2, 3, 10, 20, 30, 40, 100, 200, 300, 400, 500],
        }
    )

看起来像这样:

shape: (12, 3)
┌─────┬─────┬─────┐
│ id  ┆ a   ┆ b   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1   ┆ 1   ┆ 1   │
│ 1   ┆ 2   ┆ 2   │
│ 1   ┆ 3   ┆ 3   │
│ 2   ┆ 10  ┆ 10  │
│ 2   ┆ 20  ┆ 20  │
│ …   ┆ …   ┆ …   │
│ 3   ┆ 100 ┆ 100 │
│ 3   ┆ 200 ┆ 200 │
│ 3   ┆ 300 ┆ 300 │
│ 3   ┆ 400 ┆ 400 │
│ 3   ┆ 500 ┆ 500 │
└─────┴─────┴─────┘

有没有办法将第一个

pl.DataFrame
操纵为第二个
pl.DataFrame

python dataframe python-polars
1个回答
0
投票

你可以

explode
,然后
unnest
:

df.explode('s').unnest('s')

输出:

┌─────┬─────┬─────┐
│ id  ┆ a   ┆ b   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 1   ┆ 1   ┆ 1   │
│ 1   ┆ 2   ┆ 2   │
│ 1   ┆ 3   ┆ 3   │
│ 2   ┆ 10  ┆ 10  │
│ 2   ┆ 20  ┆ 20  │
│ …   ┆ …   ┆ …   │
│ 3   ┆ 100 ┆ 100 │
│ 3   ┆ 200 ┆ 200 │
│ 3   ┆ 300 ┆ 300 │
│ 3   ┆ 400 ┆ 400 │
│ 3   ┆ 500 ┆ 500 │
└─────┴─────┴─────┘
© www.soinside.com 2019 - 2024. All rights reserved.