Reputation: 5586
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
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
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
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