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

如何将Polars DataFrame的分组列转换为单列并重构为长格式表?

Polars宽表转长表:合并前缀相同的列

实现步骤

  • 提取所有以a_开头的列,通过melt转换为单列a,保持你需要的行顺序
  • 用同样方法处理以b_开头的列,得到单列b
  • 横向合并这两个单列DataFrame,得到最终的长格式结果

完整代码示例

import polars as pl

# 构造示例DataFrame(替换为你的实际数据)
df = pl.DataFrame({
    "a_0": [1, 4],
    "a_1": [2, 5],
    "a_2": [3, 6],
    "b_0": [7, 10],
    "b_1": [8, 11],
    "b_2": [9, 12]
})

# 生成a列:匹配所有a_*列并转成单列
a_col = df.select(pl.col("^a_.*$")).melt(value_name="a").select("a")
# 生成b列:匹配所有b_*列并转成单列
b_col = df.select(pl.col("^b_.*$")).melt(value_name="b").select("b")

# 合并得到长格式DataFrame
long_df = pl.concat([a_col, b_col], how="horizontal")

# 查看结果
print(long_df)

代码说明

  • pl.col("^a_.*$")使用正则表达式精准匹配所有以a_开头的列,避免误选其他列
  • melt()会按原列顺序,将每一行的多列值依次展开为多行,完全符合你要求的a_0[0], a_1[0], a_2[0], a_0[1],...的排列顺序
  • 横向合并后,a和b列的行一一对应,保证数据关联正确

简洁链式写法

如果想简化代码,也可以写成链式调用:

long_df = pl.concat(
    [
        df.select(pl.col("^a_.*$")).melt(value_name="a").select("a"),
        df.select(pl.col("^b_.*$")).melt(value_name="b").select("b")
    ],
    how="horizontal"
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 00:56:28