缺少列时在vcat上进行重大更改

abx*_*x78 0 julia

使用Julia 0.5时,我经常这样做:

A = DataFrame(ID = [20,40], Name = ["John Doe", "Jane Doe"])
B = DataFrame(ID = [60,80], Job = ["Sailor", "Sommelier"])
C = DataFrame(Year = [1978, 1982], Test = ["Something", "Somewhere"])
vcat(A,B,C)
Run Code Online (Sandbox Code Playgroud)

结果数据框

现在,我尝试使用v0.6.4复制相同内容,但出现错误:

ArgumentError:参数1缺少列Job,Year和Test,参数2缺少列Name,Year和Test,并且ID,Name和Job列缺失来自论点3

我没有任何运气就试图深入阅读本文。有人可以向我澄清一下吗?

Bog*_*ski 5

现在,vcatDataFrames严格的事实,级联DataFrames包含相同的列。

如果您vcat在加载DataFrames程序包后阅读的帮助,则会发现:

所有传递的数据帧中的列名必须相同,但它们可以具有不同的顺序。在这种情况下,将使用第一个传递的名称顺序DataFrame

解决该问题的方法是将缺少的列添加到所有数据框。您可以在示例中按以下步骤进行操作(请注意,尽管现在该missing操作用于指示缺少的值):

julia> for n in unique([names(A); names(B); names(C)]), df in [A,B,C]
       n in names(df) || (df[n] = missing)
       end

julia> [A; B; C]
6×5 DataFrames.DataFrame
? Row ? ID      ? Name     ? Job       ? Year    ? Test      ?
??????????????????????????????????????????????????????????????
? 1   ? 20      ? John Doe ? missing   ? missing ? missing   ?
? 2   ? 40      ? Jane Doe ? missing   ? missing ? missing   ?
? 3   ? 60      ? missing  ? Sailor    ? missing ? missing   ?
? 4   ? 80      ? missing  ? Sommelier ? missing ? missing   ?
? 5   ? missing ? missing  ? missing   ? 1978    ? Something ?
? 6   ? missing ? missing  ? missing   ? 1982    ? Somewhere ?
Run Code Online (Sandbox Code Playgroud)

如果要避免修改原件DataFrames,则应先复制它们。