Alex A.
Alex A.

Reputation: 5586

Row bind Julia data frames

How do I append one data frame to another, akin to SQL's union or R's rbind?

Say I have data frames A and B defined as follows.

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

One way to approach this would be as follows:

C = deepcopy(A)

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

While this works, it feels a little hacky to me. Is there a better or more idiomatic way to do this?

Upvotes: 16

Views: 5640

Answers (3)

xiaodai
xiaodai

Reputation: 16014

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

Upvotes: 1

GuiWil
GuiWil

Reputation: 141

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).

Upvotes: 4

Reza Afzalan
Reza Afzalan

Reputation: 5746

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 | 

Upvotes: 9

Related Questions