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

时间:2018-07-26 17:17:43

标签: 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)

Resulting DataFrame

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

  

ArgumentError:参数1缺少作业,年份和测试列,参数2缺少名称,年份和测试列,ID,名称和列作业缺少参数3

在没有运气的情况下,我试图深入阅读本文。 有人可以向我澄清一下吗?

1 个答案:

答案 0 :(得分:5)

现在vcat中的DataFrames严格要求串联的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 │

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