如何在Polars中通过单步操作按任意步长将行转列?
单链表达式实现Polars按步长分组转列
你可以通过添加索引、计算分组与列标识、透视转置的单链操作实现需求,无需拆分多个DataFrame再合并。完整代码如下:
import polars as pl text = "a brown fox jumps over a lazy dog's head" step = 3 dff = ( pl.DataFrame({"a": text.split(" ")}) .with_row_index("idx") .with_columns( group=pl.col("idx") // step, col_label=pl.col("idx") % step ) .pivot( index="group", columns="col_label", values="a" ) .rename({0: "first", 1: "second", 2: "third"}) .drop("group") ) print(dff)
输出结果和你原来的一致:
shape: (3, 3) ┌───────┬────────┬───────┐ │ first ┆ second ┆ third │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ str │ ╞═══════╪════════╪═══════╡ │ a ┆ brown ┆ fox │ │ jumps ┆ over ┆ a │ │ lazy ┆ dog's ┆ head │ └───────┴────────┴───────┘
步骤说明:
with_row_index("idx"):添加行索引列,用于后续计算分组和列位置with_columns:group=pl.col("idx") // step:计算每个元素所属的目标行分组(每step个元素为一组)col_label=pl.col("idx") % step:计算每个元素在目标行中的列位置(0对应first,1对应second,2对应third)
pivot:以group为行索引,col_label为列名,a为值进行透视转置,自动对齐同组元素rename:把默认的数字列名改为你需要的first/second/thirddrop("group"):移除临时分组列,得到最终结果
这种方式全程单链操作,避免了多个中间DataFrame的创建,更符合Polars的链式API风格,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者pedrosaurio
相关产品推荐
相关产品推荐

