在 Julia 中预分配已知大小的数据框
Preallocate a data frame of known size in Julia
当我进行 运行 模拟时,我喜欢初始化一个大的空数组,并在模拟迭代到最后时填充它。我用 res = Array(Real,(n_iterations,n_parameters))
之类的东西来做到这一点。但是,命名列会很好,我认为这意味着使用 DataFrame。然而,当我尝试执行 res_df = convert(DataFrame,res)
之类的操作时,它会抛出错误。我想要一种比 res_df = DataFrame(a=Array(Real,N),b=Array(Real,N),c=Array(Real,N),....)
的答案更简洁的方法:julia create an empty dataframe and append rows to it
要预分配数据框,您必须预分配它的列。您可以通过简单地执行 [fill(missing, 10000) for _ in 1:3]
来创建充满 missing
值的三列,但这实际上根本不会分配任何东西,因为这些向量 只能 保存一个值— missing
— 因此以后无法更改它们以保留其他值。一种方法是使用 to Vector
可以容纳 Missing
或 Float64
:
的构造函数
julia> DataFrame([Vector{Union{Missing, Float64}}(missing, 10000) for _ in 1:3], [:a, :b, :c])
10000×3 DataFrame
Row │ a b c
│ Float64? Float64? Float64?
───────┼──────────────────────────────
1 │ missing missing missing
2 │ missing missing missing
⋮ │ ⋮ ⋮ ⋮
10000 │ missing missing missing
9997 rows omitted
请注意,这不是 Real
,而是使用具体的 Float64
——这将有明显更好的性能。
(编辑此答案以反映 DataFrames v1.0 语法)
当我进行 运行 模拟时,我喜欢初始化一个大的空数组,并在模拟迭代到最后时填充它。我用 res = Array(Real,(n_iterations,n_parameters))
之类的东西来做到这一点。但是,命名列会很好,我认为这意味着使用 DataFrame。然而,当我尝试执行 res_df = convert(DataFrame,res)
之类的操作时,它会抛出错误。我想要一种比 res_df = DataFrame(a=Array(Real,N),b=Array(Real,N),c=Array(Real,N),....)
的答案更简洁的方法:julia create an empty dataframe and append rows to it
要预分配数据框,您必须预分配它的列。您可以通过简单地执行 [fill(missing, 10000) for _ in 1:3]
来创建充满 missing
值的三列,但这实际上根本不会分配任何东西,因为这些向量 只能 保存一个值— missing
— 因此以后无法更改它们以保留其他值。一种方法是使用 to Vector
可以容纳 Missing
或 Float64
:
julia> DataFrame([Vector{Union{Missing, Float64}}(missing, 10000) for _ in 1:3], [:a, :b, :c])
10000×3 DataFrame
Row │ a b c
│ Float64? Float64? Float64?
───────┼──────────────────────────────
1 │ missing missing missing
2 │ missing missing missing
⋮ │ ⋮ ⋮ ⋮
10000 │ missing missing missing
9997 rows omitted
请注意,这不是 Real
,而是使用具体的 Float64
——这将有明显更好的性能。
(编辑此答案以反映 DataFrames v1.0 语法)