# How to make empty dataframe with column names?

**URL:** <https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936>\
**Category:** Data\
**Created:** [March 15, 2022, 11:47pm UTC](https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936 "2022-03-15T23:47:48Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![rmsmsgood](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rmsmsgood/32/20544_2.png) [@rmsmsgood](https://discourse.julialang.org/u/rmsmsgood)\
**Post date:** [March 15, 2022, 11:47pm UTC](https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936/1 "2022-03-15T23:47:48Z")

</div>

```julia
df = DataFrame(x = [], y = String[])
0×2 DataFrame

```

I know that empty dataframe with column names, but if i have long column names below, how can i make the empty dataframe?

```julia
julia> nodenames
224-element Vector{String}:
 "Afghanistan"
 "Albania"
 "Algeria"
 "American Samoa"
 "Angola"
 "Anguilla"
 ⋮
 "Virgin Islands"
 "Wallis and Futuna"
 "Western Sahara"
 "Yemen"
 "Zambia"
 "Zimbabwe"

```

---

<div class="post-metadata">

**Author:** ![claylyons](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/claylyons/32/27450_2.png) [@claylyons](https://discourse.julialang.org/u/claylyons)\
**Post date:** [March 16, 2022, 12:01am UTC](https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936/2 "2022-03-16T00:01:21Z")

</div>

Here is one form.

```julia
julia> df = DataFrame([[],[],[]], ["one", "two", "three"])
0×3 DataFrame

julia> push!(df, [1, 2, 3])
1×3 DataFrame
 Row │ one two three 
     │ Any Any Any   
─────┼─────────────────
   1 │ 1 2 3

```

---

<div class="post-metadata">

**Author:** ![rmsmsgood](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rmsmsgood/32/20544_2.png) [@rmsmsgood](https://discourse.julialang.org/u/rmsmsgood)\
**Post date:** [March 16, 2022, 12:08am UTC](https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936/3 "2022-03-16T00:08:21Z")

</div>

Thank you! For others, i suggest below:

```julia
julia> DataFrame([[] for _ = nodenames] , nodenames)
0×224 DataFrame

```

---

<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:** [March 16, 2022, 10:09am UTC](https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936/4 "2022-03-16T10:09:33Z")

</div>

A more convenient way to do it might be:

```julia
DataFrame([name => [] for name in nodenames])

```

Note that this way you create columns with `Any` eltype. Maybe you would prefer more concrete eltypes, e.g.:

```julia
DataFrame([name => Int[] for name in nodenames])

```

---

<div class="post-metadata">

**Author:** ![rocco\_sprmnt21](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/rocco_sprmnt21/32/20127_2.png) [@rocco\_sprmnt21](https://discourse.julialang.org/u/rocco_sprmnt21)\
**Post date:** [March 17, 2022, 9:55am UTC](https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936/5 "2022-03-17T09:55:53Z")

</div>

also  
(I don’t know if they are preferable in any way to the other proposals.  
just to show a slightly different way)

```julia
DataFrame(fill(Int[],length(nodenames)),nodenames)

DataFrame(Matrix{Int64}(undef, 0,length(nodenames)), nodenames)

```

or use `empty!(df)` function if you already have some similar `df`

---

<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:** [March 17, 2022, 10:21am UTC](https://discourse.julialang.org/t/how-to-make-empty-dataframe-with-column-names/77936/6 "2022-03-17T10:21:19Z")

</div>

> [@rocco\_sprmnt21](#):
>
> `DataFrame(fill(Int[],length(nodenames)),nodenames)`

This pattern is correct, but I would not recommend it as `fill(Int[],length(nodenames))` reuses the `Int[]` vector. The only reason why this works properly is that, by default `DataFrame` constructor copies columns.

This is the reason why I have not shown the option:

```julia
DataFrame(nodenames .=> Ref([]))

```

which is short, but it has the same flaw.

To show you what I mean by the risk consider the following example:

```julia
julia> nodenames = ["a", "b", "c"]
3-element Vector{String}:
 "a"
 "b"
 "c"

julia> df = DataFrame(fill(Int[],length(nodenames)),nodenames; copycols=false)
0×3 DataFrame

julia> push!(df.a, 100)
1-element Vector{Int64}:
 100

julia> df
1×3 DataFrame
 Row │ a b c
     │ Int64 Int64 Int64
─────┼─────────────────────
   1 │ 100 100 100

```
