我正在尝试从数据框中删除一些列,并且不希望返回修改后的数据框并将其重新分配给旧数据框。相反,我希望该功能只是修改数据框。这就是我尝试的但它似乎没有做我除外。我的印象参数是作为参考而不是按价值传递的?
function remove_cols! (df::DataFrame, cols)
df = df[setdiff(names(df), cols)];
end
df = DataFrame(x = [1:10], y = [11:20]);
remove_cols!(df, [:y]); # this does not modify the original data frame
当然下面的内容有效,但我希望如果remove_cols!
刚刚更改了df
df = remove_cols!(df, [:y]);
如何在我的功能中更改df?
谢谢!
答案 0 :(得分:5)
据我所知,朱莉娅使用所谓的共享传递,这意味着引用是通过值传递的。因此,当您将DataFrame传递给函数时,会创建一个对函数本地的DataFrame的新引用。当您使用自己对DataFrame的引用重新分配本地df
变量时,它对单独的全局变量及其对DataFrame的单独引用没有影响。
有一个function in DataFrames.jl用于删除DataFrames中的列。
答案 1 :(得分:0)
一般来说,要回答有关如何在自己的函数中使数据框发生变异的问题,关键是要使用使函数内的数据框发生变异的函数和操作。例如,请参见下面的基于标准数据框append!
函数的函数,该函数具有一些附加的好处,例如可以从任意数量的数据帧追加,列的顺序无关紧要,丢失的列将添加到数据帧:
function append_with_missing!(df1::DataFrame, dfs::AbstractDataFrame...)
columns = Dict{Symbol, Type}(zip(names(df1), colwise(eltype, df1)))
for df in dfs
columns_temp = Dict(zip(names(df), colwise(eltype, df)))
merge!(columns, columns_temp)
end
for (n, t) in columns, df in [df1; [i for i in dfs]]
n in names(df) || (df[n] = Vector{Union{Missing,t}}(missing, size(df, 1)))
end
for df in dfs
append!(df1, df[names(df1)])
end
end
在这里,传递给自己的第一个数据帧被其他数据帧添加的行所突变。
(添加缺失列的功能基于@BogumiłKamiński在此处给出的答案:Breaking change on vcat when columns are missing)