You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars中实现类似numpy的reshape(-1,3)重塑DataFrame?

解决Polars DataFrame类似numpy reshape(-1,3)的需求

针对你的需求,核心是将原DataFrame的后3列作为新行,按对应数据类型列的方式堆叠到前3列下方。unpivot()不适用是因为它是将列转为键值对结构,和你的需求不符。以下是高效的Polars原生实现方案:

直接实现(针对固定6列转3列)

import polars as pl

# 原DataFrame
df = pl.from_repr("""
┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐
│ Column 1 ┆ Column 2 ┆ Column 3 ┆ Column 4 ┆ Column 5 ┆ Column 6 │
│ ---      ┆ ---      ┆ ---      ┆ ---      ┆ ---      ┆ ---      │
│ str      ┆ i64      ┆ str      ┆ str      ┆ i64      ┆ str      │
╞══════════╪══════════╪══════════╪══════════╪══════════╪══════════╡
│ A        ┆ 1        ┆ W        ┆ B        ┆ 2        ┆ X        │
│ C        ┆ 3        ┆ Y        ┆ D        ┆ 4        ┆ Z        │
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
""")

# 提取前3列 + 提取后3列并重命名为前3列的列名,然后垂直拼接
result = df.select(pl.col("Column 1", "Column 2", "Column 3")).vstack(
    df.select(
        pl.col("Column 4").alias("Column 1"),
        pl.col("Column 5").alias("Column 2"),
        pl.col("Column 6").alias("Column 3")
    )
)

print(result)

执行后会得到目标DataFrame:

┌──────────┬──────────┬──────────┐
│ Column 1 ┆ Column 2 ┆ Column 3 │
│ ---      ┆ ---      ┆ ---      │
│ str      ┆ i64      ┆ str      │
╞══════════╪══════════╪══════════╡
│ A        ┆ 1        ┆ W        │
│ C        ┆ 3        ┆ Y        │
│ B        ┆ 2        ┆ X        │
│ D        ┆ 4        ┆ Z        │
└──────────┴──────────┴──────────┘

通用化实现(适用于列数为3的倍数的情况)

如果你的列数是3的倍数(比如9列、12列),想要批量分组堆叠,可以用以下方式:

# 按每3列分组,生成多个子DataFrame,重命名列后拼接
group_size = 3
groups = [df.select(pl.col(df.columns[i:i+group_size]).alias([f"Column {j+1}" for j in range(group_size)])) 
          for i in range(0, len(df.columns), group_size)]

result = pl.concat(groups)

这种方式无需硬编码列名,更灵活,同时完全使用Polars原生操作,避免了转换为numpy的额外开销。

内容的提问来源于stack exchange,提问作者user619755

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:12:45