我有一个列为a_0, a_1, a_2, b_0, b_1, b_2
的极地数据框.我想将它转换为更长更细的数据帧(3x行,但只有2列a
和b
),这样a
包含a_0[0], a_1[0], a_2[0], a_0[1], a_1[1], a_2[1],...
,b
也包含a_0[0], a_1[0], a_2[0], a_0[1], a_1[1], a_2[1],...
.我怎么能做到这一点?
我有一个列为a_0, a_1, a_2, b_0, b_1, b_2
的极地数据框.我想将它转换为更长更细的数据帧(3x行,但只有2列a
和b
),这样a
包含a_0[0], a_1[0], a_2[0], a_0[1], a_1[1], a_2[1],...
,b
也包含a_0[0], a_1[0], a_2[0], a_0[1], a_1[1], a_2[1],...
.我怎么能做到这一点?
您可以使用concat_list()
将所需的列联接在一起,然后使用explode()
将它们转换为行.
让我们以简单的数据框为例:
df = pl.DataFrame(
data=[[x for x in range(6)]],
schema=[f"a_{i}" for i in range(3)] + [f"b_{i}" for i in range(3)]
)
┌─────┬─────┬─────┬─────┬─────┬─────┐
│ a_0 ┆ a_1 ┆ a_2 ┆ b_0 ┆ b_1 ┆ b_2 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╪═════╪═════╪═════╡
│ 0 ┆ 1 ┆ 2 ┆ 3 ┆ 4 ┆ 5 │
└─────┴─────┴─────┴─────┴─────┴─────┘
现在,你可以reshape 它了.首先,将列连接到列表中,并为最终结果重命名列:
import polars.selectors as cs
df.select(
pl.concat_list(cs.starts_with(x)).alias(x) for x in ['a','b']
)
┌───────────┬───────────┐
│ a ┆ b │
│ --- ┆ --- │
│ list[i64] ┆ list[i64] │
╞═══════════╪═══════════╡
│ [0, 1, 2] ┆ [3, 4, 5] │
└───────────┴───────────┘
否,将列表分解为行:
df.select(
pl.concat_list(cs.starts_with(x)).alias(x) for x in ['a','b']
).explode(pl.all())
┌─────┬─────┐
│ a ┆ b │
│ --- ┆ --- │
│ i64 ┆ i64 │
╞═════╪═════╡
│ 0 ┆ 3 │
│ 1 ┆ 4 │
│ 2 ┆ 5 │
└─────┴─────┘