
本文介绍使用 Polars 的 unpivot() 方法,将按月聚合的均值、中位数等多指标宽表(如 month/avg/med)一键转换为适配绘图库(如 Altair、Plotly 或 Matplotlib)所需的长格式(month/type/value),替代已弃用的 melt(),代码简洁、语义清晰、性能优异。
本文介绍使用 polars 的 `unpivot()` 方法,将按月聚合的均值、中位数等多指标宽表(如 month/avg/med)一键转换为适配绘图库(如 altair、plotly 或 matplotlib)所需的长格式(month/type/value),替代已弃用的 `melt()`,代码简洁、语义清晰、性能优异。
在数据可视化前,常需将聚合后的宽格式 DataFrame(如含 month、avg、med 多列)重构为长格式——即每行表示一个观测:一个时间点、一种统计类型、一个数值。这种结构是绝大多数现代可视化库(如 Altair、Plotly、Seaborn)推荐的数据形态。
Polars 提供了专为此类场景设计的 unpivot() 方法,它比旧版 melt() 更直观、更健壮,且自 Polars v0.20.0 起已成为标准接口(melt() 已标记为 deprecated)。
✅ 推荐做法:使用 unpivot(index=..., variable_name=..., value_name=...)
假设你已完成分组聚合(注意:原问题中误用了 pd.col,应为 pl.col):
import polars as pl
# 正确的 Polars 聚合(示例)
df = (data
.group_by("month_code")
.agg(
avg=pl.col("value").mean(),
med=pl.col("value").median()
)
.sort("month_code")
)
得到宽表后,只需一行即可完成重塑:
df_long = df.unpivot(
index="month_code", # 保留为标识列(不展开的列)
variable_name="type", # 新列名,存储原列名(如 "avg", "med")
value_name="value" # 新列名,存储对应数值
)
输出结构与目标完全一致:
shape: (6, 3) ┌────────────┬──────┬──────────┐ │ month_code ┆ type ┆ value │ │ --- ┆ --- ┆ --- │ │ str ┆ str ┆ f64 │ ╞════════════╪══════╪══════════╡ │ M202412 ┆ avg ┆ 0.037824 │ │ M202501 ┆ avg ┆ 0.03616 │ │ M202502 ┆ avg ┆ 0.038919 │ │ M202412 ┆ med ┆ 0.01381 │ │ M202501 ┆ med ┆ 0.013028 │ │ M202502 ┆ med ┆ 0.014843 │ └────────────┴──────┴──────────┘
? 注意事项与技巧
-
无需显式列出变量列:只要指定
index,unpivot()会自动将其余所有列作为待展开的变量(相比melt()更安全,避免遗漏或拼写错误)。 -
列名可自定义:
variable_name和value_name参数允许灵活命名新列(如设为"stat"和"estimate"),提升可读性。 -
链式调用友好:可无缝嵌入 Polars 表达式链,例如:
chart_data = ( data.group_by("month_code") .agg(pl.col("value").mean().alias("avg"), pl.col("value").median().alias("med")) .sort("month_code") .unpivot(index="month_code", variable_name="type", value_name="value") ) -
兼容可视化库:转换后的
df_long可直接传入 Altair(.mark_line().encode(x='month_code', y='value', color='type'))、Plotly(px.line(df_long, x='month_code', y='value', color='type'))等。
✅ 总结
df.unpivot(index="key_col", variable_name="category", value_name="value") 是 Polars 中实现“宽→长”转换最简洁、最可靠的方式。它语义明确、容错性强、性能优秀,是构建可复用分析流水线与交互式图表的标准实践。请务必优先选用 unpivot(),避免使用已弃用的 melt()。










