Let's say I have dataframe and vector such as :
dataframe = DataFrame(Data1 = rand(10), Data2 = rand(10));
Data3 = rand(10)
I want to add Data3
to the dataframe such as:
Data1 Data2 Data3
Float64 Float64 Float64
1 0.757345 0.903133 0.502133
2 0.294749 0.327502 0.323133
3 0.156397 0.427323 0.123133
In Python, I can just df["Data3"] = Data3
to add column, but in Julia dataframe, df[!,Data3] = Data3
returns :
- MethodError: no method matching setindex!(::DataFrame, ::Vector{Float64}, ::typeof(!), ::Vector{Float64})
Also I've checked this solution, but this gave me :
- ArgumentError: syntax df[column] is not supported use df[!, column] instead.
How can I add vector as a new column in Julia Dataframe?
CodePudding user response:
You were almost there, you are looking for:
dataf[!, :Data3] = Data3
or
dataframe[!, "Data3"] = Data3
or
dataframe.Data3 = Data3
note that I'm using a Symbol
or String
here - the [!, :Data3]
is an indexing operation, so it needs an identifier of the row (!
) and column (:Data3
) index where you want the data to be stored, not the data itself.
You are binding the actual data (a 10-element vector of random numbers) to the variable Data3
, so doing dataframe[!, Data3]
with the variable Data3
(rather than a Symbol
or String
with the value "Data3"
) is equivalent to doing
dataframe[!, rand(10)]
which means "I want to access all rows (!
) of a DataFrame, and 10 columns identified by 10 random numbers". Now indexing by a random floating point number doesn't make a lot of sense (what should dataframe[!, 0.532]
return?) which is why you get the error you see - setindex
does not accept a Vector{Float}
as an argument.
Regarding the Discourse thread you linked, it is very old and the df["col"]
syntax has been deprecated a long time ago. The basic indexing concept in DataFrames
is that a DataFrame
is a two-dimensional data structure, and as such should be indexed by df[row_indices, col_indices]
.
DataFrames
supports a variety of ways of specifying valid indices, which are too numerous to go into detail here but are listed in the docs here.