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

