Dataframe 如何变异数据帧?

Dataframe 如何变异数据帧?,dataframe,julia,Dataframe,Julia,我试图从数据框中删除一些列,但不希望返回修改后的数据框并将其重新分配给旧数据框。相反,我希望函数只修改数据帧。这是我尝试过的,但它似乎没有做我想做的。我的印象是,参数是作为引用传递的,而不是按值传递的 function remove_cols! (df::DataFrame, cols) df = df[setdiff(names(df), cols)]; end df = DataFrame(x = [1:10], y = [11:20]); remove_cols!(df, [:

我试图从数据框中删除一些列,但不希望返回修改后的数据框并将其重新分配给旧数据框。相反,我希望函数只修改数据帧。这是我尝试过的,但它似乎没有做我想做的。我的印象是,参数是作为引用传递的,而不是按值传递的

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\u cols刚刚将df更改到位

df = remove_cols!(df, [:y]);
我如何在我的功能内就地更改df


谢谢

据我所知,它使用了所谓的传递共享,这意味着引用是按值传递的。因此,当您将数据帧传递给函数时,将创建一个新的数据帧引用,该引用是函数的本地引用。当您重新分配本地
df
变量及其自身对数据帧的引用时,它对单独的全局变量及其对数据帧的单独引用没有影响


删除数据帧中的列有一个简单的方法。

一般来说,要回答如何在自己的函数中改变数据帧的问题,关键是使用在函数中改变数据帧的函数和操作。例如,请参见下面的函数,该函数基于标准数据帧
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这里给出的答案:)

谢谢!我认为,这一问题似乎在某种程度上得到了回报。如果我做df[1,1]=55,它会改变原始数据帧。与其重新发明轮子,我将只使用
delete
(如果不查看源代码,很难找到这些方法-感谢您为我指明了正确的方向)