# Mutating version of vcat for data frames

**URL:** <https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581>\
**Category:** New to Julia\
**Tags:** dataframes\
**Created:** [October 11, 2022, 3:48pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581 "2022-10-11T15:48:40Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![martinmestre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martinmestre/32/215857_2.png) [@martinmestre](https://discourse.julialang.org/u/martinmestre)\
**Post date:** [October 11, 2022, 3:48pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/1 "2022-10-11T15:48:40Z")

</div>

Hello, I need a mutating version of `vcat` for dataframes. This is because I must do the concatenation inside a mutating function so as not to define new temporary data frames.  
This is an example of how I would like to use it, the dataframe I want to mutate is called `df_streams`.

```julia
"""Single stream match with the catalog."""
function match_stream_catalog!(stream::Py, df_cat::DataFrame, df_streams::DataFrame)
    window = [[minimum(stream.track.ra.deg), maximum(stream.track.ra.deg)],
              [minimum(stream.track.dec.deg), maximum(stream.track.dec.deg)]]
    window = pyconvert(Vector{Vector{Float64}}, window)
    stream_name = pyconvert(String, stream.stream_name)
    field = get_field(window, df_cat)
    field.track = Vector{String}(repeat([stream_name], size(field,1)))
    ra = Py(field.RA)
    dec = Py(field.DEC)
    field_coord = ac.SkyCoord(ra=ra*u.deg, dec=dec*u.deg, frame="icrs")
    ontrack = stream.get_mask_in_poly_footprint(field_coord)
    vcat!(df_streams, field[pyconvert(BitVector,ontrack),:])
    return nothing
end

```

Thank you very much.

Update: is the solution `append!` ? And for ` hcat` ?

---

<div class="post-metadata">

**Author:** ![stillyslalom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stillyslalom/32/45687_2.png) [@stillyslalom](https://discourse.julialang.org/u/stillyslalom)\
**Post date:** [October 11, 2022, 5:22pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/2 "2022-10-11T17:22:28Z")

</div>

To append individual rows to an existing `DataFrame`, you can use `push!` (or `append!` for multiple rows, but that would require allocating temporaries). For `hcat`, it’s exactly that: `hcat(df1, df2)`, or `hcat(df1, df1, copycals=false)` for low-allocation concatenation.

---

<div class="post-metadata">

**Author:** ![martinmestre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martinmestre/32/215857_2.png) [@martinmestre](https://discourse.julialang.org/u/martinmestre)\
**Post date:** [October 11, 2022, 5:59pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/3 "2022-10-11T17:59:04Z")

</div>

Thank you! I must concatenate two dataframes. I tried with `hcat(df1, df2, copycals=false)` but it doesn’t mutate df1 nor df2.  
If I use `append!(df1,df2)`, does it use temporary dataframe as if I did:  
`df3=hcat(df1,df2)` or its something different ?  
I would like to use as few RAM as possible.  
Thanks.

---

<div class="post-metadata">

**Author:** ![stillyslalom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stillyslalom/32/45687_2.png) [@stillyslalom](https://discourse.julialang.org/u/stillyslalom)\
**Post date:** [October 11, 2022, 6:10pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/4 "2022-10-11T18:10:25Z")

</div>

A `DataFrame` is (more or less) just a list of named vectors, and `hcat(..., copycols=false)` doesn’t copy the underlying vectors:

```julia
julia> df1, df2 = DataFrame(a = rand(10^6)), DataFrame(b = 1:10^6);

julia> @time df1 = hcat(df1, df2, copycols=false);
  0.000019 seconds (18 allocations: 1.406 KiB)

```

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [October 11, 2022, 6:15pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/5 "2022-10-11T18:15:28Z")

</div>

If you want to vertically append in-place use `append!` or `prepend!` (they are equivalents of `vcat` that allocates a new data frame).

If you want to horizontally add columns in-place to a data frame use `insertcols!`. Here is an example:

```julia
julia> df = DataFrame(a=1:2, b=3:4)
2×2 DataFrame
 Row │ a b
     │ Int64 Int64
─────┼──────────────
   1 │ 1 3
   2 │ 2 4

julia> df2 = DataFrame(c=11:12, d=13:14)
2×2 DataFrame
 Row │ c d
     │ Int64 Int64
─────┼──────────────
   1 │ 11 13
   2 │ 12 14

julia> insertcols!(df, pairs(eachcol(df2))...)
2×4 DataFrame
 Row │ a b c d
     │ Int64 Int64 Int64 Int64
─────┼────────────────────────────
   1 │ 1 3 11 13
   2 │ 2 4 12 14

```

Use `copycols` to decide if `df` should alias or copy columns from `df2`. By default it will copy.

---

<div class="post-metadata">

**Author:** ![bkamins](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/bkamins/32/208538_2.png) [@bkamins](https://discourse.julialang.org/u/bkamins)\
**Post date:** [October 11, 2022, 6:17pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/6 "2022-10-11T18:17:18Z")

</div>

There is also a discussion to expose `hcat!` in [this issue](https://github.com/JuliaData/DataFrames.jl/issues/2632), but currently no one really needed it often so we have not done it. (the `hcat!` function is available internally, but is not part of public API).

---

<div class="post-metadata">

**Author:** ![martinmestre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martinmestre/32/215857_2.png) [@martinmestre](https://discourse.julialang.org/u/martinmestre)\
**Post date:** [October 11, 2022, 6:20pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/7 "2022-10-11T18:20:17Z")

</div>

Thanks, now I understood how to use `copycols=false` with `df1=hcat(df1,...)`.

---

<div class="post-metadata">

**Author:** ![martinmestre](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/martinmestre/32/215857_2.png) [@martinmestre](https://discourse.julialang.org/u/martinmestre)\
**Post date:** [October 11, 2022, 6:24pm UTC](https://discourse.julialang.org/t/mutating-version-of-vcat-for-data-frames/88581/8 "2022-10-11T18:24:47Z")

</div>

Thank you very much for this explanation. I will use `append!(df1,df2)`.
