【问题标题】:Row bind Julia data frames行绑定 Julia 数据帧
【发布时间】:2016-03-24 17:06:48
【问题描述】:

如何将一个数据帧附加到另一个数据帧,类似于 SQL 的 union 或 R 的 rbind

假设我有数据框 AB 定义如下。

A = DataFrame(x = [1, 2, 3], y = [4, 5, 6])
B = DataFrame(x = [4, 5, 6], y = [7, 8, 9])

解决此问题的一种方法如下:

C = deepcopy(A)

for i = 1:size(B, 1)
    push!(C, Array(B[i,:]))
end

虽然这行得通,但对我来说感觉有点 hacky。有没有更好或更惯用的方法来做到这一点?

【问题讨论】:

  • 受 Reza 的回答启发,更详细的版本是 vcat(A,B)

标签: append dataframe julia


【解决方案1】:

数组串联[A;B] 是将一个DataFrame 的行添加到另一个的最简单方法:

julia> A = DataFrame(x = [1, 2, 3], y = [4, 5, 6]);
julia> B = DataFrame(x = [4, 5, 6], y = [7, 8, 9]);
julia> [A;B]
6x2 DataFrames.DataFrame
| Row | x | y |
|-----|---|---|
| 1   | 1 | 4 |
| 2   | 2 | 5 |
| 3   | 3 | 6 |
| 4   | 4 | 7 |
| 5   | 5 | 8 |
| 6   | 6 | 9 | 

【讨论】:

  • 这太完美了,谢谢!出于好奇,您知道这是否记录在某处吗?它工作得很好,但我似乎无法在 DataFrame 文档中找到它。
  • 在 REPL 中输入?DataFrame,将打印出DataFrame 的有用方法列表。
【解决方案2】:

我也有同样的问题。事实证明,使用append! 函数有一种更有效的方法:

append!(A,B)

这会修改原始数据框A。如果你想创建一个新的数据框,你可以这样做:

C = deepcopy(A)
append!(C,B)

请注意,此解决方案比 C=vcat(A,B) 更有效。运行以下代码观察内存分配情况。

A = DataFrame(x = [1, 2, 3], y = [4, 5, 6])
B = DataFrame(x = [4, 5, 6], y = [7, 8, 9])

## method 1: deepcopy append!
@time let 
        C=deepcopy(A)
        append!(C,B)
end

## method 2: vcat
@time vcat(A,B)

## method 3: modifies A
@time append!(A,B)

我分别找到(27 个分配:2.063 KiB)、(78 个分配:5.750 KiB)和(8 个分配:352 字节)。

【讨论】:

    【解决方案3】:

    您也可以使用vcat(A,B) 将两个数据帧附加在一起。

    如果您的数据框位于数组中,那么使用像 vcat(AB...) 这样的 splat 运算符 (...) 也可以使用

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多