Row bind Julia data frames

I had the same question. It turns out there is a more efficient way by using the append! function:

append!(A,B)

This modifies the original dataframe A. If you want to create a new dataframe, you can do:

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

Note this solution is more efficient that doing C=vcat(A,B). Run the following code to observe memory allocation.

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)

I find respectively (27 allocations: 2.063 KiB), (78 allocations: 5.750 KiB) and (8 allocations: 352 bytes).


Also you can do vcat(A,B) to append two dataframes together.

If your dataframes are in an array then using the splat operator (...) like this vcat(AB...) would also work


Array concatenation [A;B] is the simplest way to add rows of one DataFrame to another:

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 |