我有一个
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
?
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 │
└─────┴─────┴─────┘