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

如何在DataFrame.jl中使用stack函数将多列DataFrame转换为目标双列DataFrame

如何用stack函数将df1转换为df2?

嘿,我来帮你搞定这个DataFrame转换的问题~ 你的需求是把df1里成对的列(x1/x2对应x,y1/y2对应y)堆叠成df2的结构,用stack函数就能轻松实现,下面给你两种实用的方法:

方法一:直接分组堆叠(最简洁推荐)

DataFrames.jl的stack函数支持分组指定列映射到新列,刚好匹配你的场景。直接把x1、x2映射到新列x,y1、y2映射到新列y就行:

using DataFrames

# 你的原始数据
df1 = DataFrame(x1 = 1:4, x2 = 5:8, y1 = Char.(65:68), y2 = Char.(69:72))
# 核心转换代码
df2 = stack(df1, [:x1, :x2] => :x, [:y1, :y2] => :y)

执行后得到的df2就是你想要的结果:

8×2 DataFrame
 Row │ x    y
     │ Int64 Char
─────┼─────────────
   1 │   1    A
   2 │   2    B
   3 │   3    C
   4 │   4    D
   5 │   5    E
   6 │   6    F
   7 │   7    G
   8 │   8    H

方法二:通用重塑法(适合列名有规律的场景)

如果你的列名数量更多、且都是「前缀+数字」的规律(比如x1/x2/x3,y1/y2/y3),可以先堆叠所有列,再提取前缀重塑:

# 先把所有列堆叠成临时表,得到variable(列名)和value(对应值)两列
stacked_temp = stack(df1)
# 从variable列里拆分出前缀(x/y)和序号(1/2)
stacked_temp[!, :prefix] = first.(string.(stacked_temp.variable))
stacked_temp[!, :num] = parse.(Int, last.(string.(stacked_temp.variable)))
# 按序号分组,把不同前缀的value转成列,最后保留x和y列
df2 = unstack(stacked_temp, :num, :prefix, :value)[:, [:x, :y]]

这种方法更灵活,适合列数多的情况,但第一种方法直接针对你的需求更高效。

小补充

  • 第一种方法里的cols => new_col语法是DataFrames.jl v1.4及以上版本支持的,如果你用的是旧版本,可以用这个等价写法:
    df2 = hcat(stack(df1, [:x1, :x2], value_name=:x), stack(df1, [:y1, :y2], value_name=:y)[!, :y])
    
    本质是分别堆叠x组和y列,再合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:51:01