如何在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及以上版本支持的,如果你用的是旧版本,可以用这个等价写法:
本质是分别堆叠x组和y列,再合并结果。df2 = hcat(stack(df1, [:x1, :x2], value_name=:x), stack(df1, [:y1, :y2], value_name=:y)[!, :y])
内容的提问来源于stack exchange,提问作者Likan Zhan
相关产品推荐
相关产品推荐

