How to do an in-place broadcasting operation on a Julia dataframe?

Viewed 355

I have a data frame with a single column "Name", I want to lowercase the value in-place.

The existing lowercase broadcast seems to create a new dataframe, how can I do this as an in-place modification?

julia> df
5×1 DataFrame
│ Row │ Name      │
│     │ String    │
├─────┼───────────┤
│ 1   │ Mary      │
│ 2   │ Anna      │
│ 3   │ Emma      │
│ 4   │ Elizabeth │
│ 5   │ Minnie    │

julia> lowercase.(df.Name)
5-element Array{String,1}:
 "mary"
 "anna"
 "emma"
 "elizabeth"
 "minnie"

julia> df
5×1 DataFrame
│ Row │ Name      │
│     │ String    │
├─────┼───────────┤
│ 1   │ Mary      │
│ 2   │ Anna      │
│ 3   │ Emma      │
│ 4   │ Elizabeth │
│ 5   │ Minnie    │
1 Answers

Here are three basic options:

julia> df = DataFrame(Name = ["Mary", "Anna", "Emma"]);

julia> @. df.Name = lowercase(df.Name); # work on a single column in place

julia> df
3×1 DataFrame
│ Row │ Name   │
│     │ String │
├─────┼────────┤
│ 1   │ mary   │
│ 2   │ anna   │
│ 3   │ emma   │

julia> df = DataFrame(Name = ["Mary", "Anna", "Emma"]);

julia> @. df = lowercase.(df); # work on a whole data frame in place

julia> df
3×1 DataFrame
│ Row │ Name   │
│     │ String │
├─────┼────────┤
│ 1   │ mary   │
│ 2   │ anna   │
│ 3   │ emma   │

julia> df = DataFrame(Name = ["Mary", "Anna", "Emma"]);

julia> transform!(df, :Name => ByRow(lowercase) => :Name); # this time the column gets replaced instead of in-place modified

julia> df
3×1 DataFrame
│ Row │ Name   │
│     │ String │
├─────┼────────┤
│ 1   │ mary   │
│ 2   │ anna   │
│ 3   │ emma   │
Related