使用 vector 扩展 DataFrame

Expand dataframe with vector

提问人:Pascal 提问时间:11/16/2023 最后编辑:Pascal 更新时间:11/17/2023 访问量:56

问:

假设我有一个 DataFrame 和一个向量ay

a = DataFrame(t = [0; 0], x = [1, 2])
y = [0.1, 0.2, 0.3]

我怎样才能将这两者结合起来,实现如下目的,优先使用?DataFramesMeta.jl

 Row │ t        x     
     │ Float64  Int64 
─────┼────────────────
   1 │     0.1      1
   2 │     0.2      1
   3 │     0.3      1
   4 │     0.1      2
   5 │     0.2      2
   6 │     0.3      2

编辑:我更喜欢使用,因为我喜欢在管道中使用它。DataFramesMeta.jl@chain

数据帧 Julia DataFrames.jl

评论


答:

0赞 BallpointBen 11/16/2023 #1

你真的不需要 DataFramesMeta;一个简单的连接就可以了。通过仅使用一个不同元素创建两列,连接成为笛卡尔乘积。t

julia> a = DataFrame(t = [0; 0], x = [1, 2])
2×2 DataFrame
 Row │ t      x     
     │ Int64  Int64 
─────┼──────────────
   1 │     0      1
   2 │     0      2

julia> b = DataFrame(t = 0, y = y)
3×2 DataFrame
 Row │ t      y       
     │ Int64  Float64 
─────┼────────────────
   1 │     0      0.1
   2 │     0      0.2
   3 │     0      0.3

julia> select(leftjoin(b, a, on=:t), :y => :t, :x)
6×2 DataFrame
 Row │ t        x      
     │ Float64  Int64? 
─────┼─────────────────
   1 │     0.1       1
   2 │     0.2       1
   3 │     0.3       1
   4 │     0.1       2
   5 │     0.2       2
   6 │     0.3       2

评论

0赞 Pascal 11/17/2023
多谢。优雅的解决方案。我询问了 DataFramesMeta.jl,因为我想在一系列管道中执行此操作。
0赞 Dan Getz 11/17/2023 #2

也许您正在寻找:


julia> @combine(a,:t = repeat(y,length(:t)),
                  :x = repeat(:x; inner=length(y)))
6×2 DataFrame
 Row │ t        x     
     │ Float64  Int64 
─────┼────────────────
   1 │     0.1      1
   2 │     0.2      1
   3 │     0.3      1
   4 │     0.1      2
   5 │     0.2      2
   6 │     0.3      2

这可以根据需要推广到其他情况。关键位是它需要多行,可以返回更多或更少的行,这与 / 保持行数不同。@combine@select@transform