如何在Polars中实现类似Pandas的按列值Unstack数据框操作?
Polars 实现分组求和后转置(Unstack)方案
直接给出对应Polars实现代码:
import polars as pl df = pl.DataFrame({ "left": ["One", "One", "One", "One", "Two"], "center": ["P", "P", "I", "I", "I"], "right": [100, 100, 100, 100, 100] }) result = ( df .group_by(["left", "center"], maintain_order=True) .agg(pl.col("right").sum()) .pivot( index="left", columns="center", values="right", aggregate_function=None, fill_value=0 ) ) print(result)
代码对应逻辑说明
- 分组求和:和你熟悉的Pandas
groupby(["left", "center"])["right"].sum()逻辑一致,Polars通过group_by(["left", "center"]).agg(pl.col("right").sum())完成分组聚合求和。加上maintain_order=True是为了保留left列的原始顺序,和示例预期输出匹配。 - Unstack转置:Pandas中的
unstack(fill_value=0)对应Polars的pivot方法:index="left":指定作为行标识的列(对应unstack后保留的索引列)columns="center":指定要转为列的字段(对应unstack的层级)values="right":指定填充到新列中的数值aggregate_function=None:因为分组后已经是唯一的left+center组合,无需再次聚合fill_value=0:填补不存在的组合值,作用和Pandas的fill_value完全相同
简化写法
如果不需要严格保留原始顺序,还可以去掉maintain_order=True,代码更简洁:
result = df.group_by(["left", "center"]).sum().pivot(index="left", columns="center", values="right", fill_value=0)
运行后会得到和预期完全一致的输出:
shape: (2, 3) ┌──────┬─────┬─────┐ │ left ┆ P ┆ I │ │ --- ┆ --- ┆ --- │ │ str ┆ i64 ┆ i64 │ ╞══════╪═════╪═════╡ │ One ┆ 200 ┆ 200 │ │ Two ┆ 0 ┆ 100 │ └──────┴─────┴─────┘
内容的提问来源于stack exchange,提问作者Zedi10
相关产品推荐
相关产品推荐

