Julia 缺少列时中断vcat上的更改
对于Julia 0.5,我习惯于这样做:Julia 缺少列时中断vcat上的更改,julia,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) 现在,我尝试在v0.6.4中复制相同的内容,但得到
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)
现在,我尝试在v0.6.4中复制相同的内容,但得到的却是一个错误:
ArgumentError:参数1中缺少列Job、Year和Test,参数2中缺少列Name、Year和Test,参数3中缺少列ID、Name和Job
我在阅读文档时试图弄清这件事的真相,但运气不好。
有人能向我澄清一下吗?现在
DataFrames
中的vcat
严格要求串联的DataFrames
包含相同的列
如果在加载DataFrames
包后阅读vcat
的帮助,您将发现:
所有传递的数据帧中的列名必须相同,但顺序可以不同。在这种情况下,将使用第一次传递的数据帧中的名称顺序
修复此问题的方法是向所有数据帧添加缺少的列。下面是如何在示例中就地执行此操作(注意,现在missing
用于指示缺少的值):
如果你想避免修改原始的数据帧
,你应该先复制它们。现在数据帧
中的vcat
严格要求串联的数据帧
包含相同的列
如果在加载DataFrames
包后阅读vcat
的帮助,您将发现:
所有传递的数据帧中的列名必须相同,但顺序可以不同。在这种情况下,将使用第一次传递的数据帧中的名称顺序
修复此问题的方法是向所有数据帧添加缺少的列。下面是如何在示例中就地执行此操作(注意,现在missing
用于指示缺少的值):
如果你想避免修改原始的数据帧
,你应该先复制它们。非常感谢@Bogumil Kaminski,它非常好用,而且非常干净!然而,我读到很多人担心vcat的性能,我可能需要为大约20列聚合数百万行。你认为我应该担心吗?有更好的方法吗?谢谢,洛蒂特应该很快,因为vcat
只使用适当的目标大小分配一次结果,然后使用copyto代码>。您可能遇到的唯一问题是当您有数千个DataFrames
到vcat
时,因为splating是无效的(如果您有中等数量的甚至大的DataFrames
都应该可以)。如果遇到这种情况,可以使用数据帧。vcat
,它接受向量作为参数。这有点滥用,因为它没有导出,所以将来可能会在没有警告的情况下更改或删除它。您可以查看\u vcat
的源代码,看看它是如何工作的。非常感谢@Bogumil Kaminski,它工作得非常好,而且非常干净!然而,我读到很多人担心vcat的性能,我可能需要为大约20列聚合数百万行。你认为我应该担心吗?有更好的方法吗?谢谢,洛蒂特应该很快,因为vcat
只使用适当的目标大小分配一次结果,然后使用copyto代码>。您可能遇到的唯一问题是当您有数千个DataFrames
到vcat
时,因为splating是无效的(如果您有中等数量的甚至大的DataFrames
都应该可以)。如果遇到这种情况,可以使用数据帧。vcat
,它接受向量作为参数。这有点滥用,因为它没有导出,所以将来可能会在没有警告的情况下更改或删除它。您可以检查\u vcat
的源代码以了解其工作原理。
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 │