如何改变DataFrame?

时间:2014-12-24 21:19:28

标签: 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, [:y]); # this does not modify the original data frame

当然下面的内容有效,但我希望如果remove_cols!刚刚更改了df

df = remove_cols!(df, [:y]);

如何在我的功能中更改df?

谢谢!

2 个答案:

答案 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