如何在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
相关产品推荐
相关产品推荐

