将字典数组一次性放入 Julia 中的 DataFrame

Jul*_*a O 6 julia

我有一系列字典如下:

julia> data  
2-element Array{Any,1}:  
 Dict{String,Any}("ratio1"=>1.36233,"time"=>"2014-06-19T15:47:40.000000Z","ratio2"=>1.36243)
 Dict{String,Any}("ratio1"=>1.3623,"time"=>"2014-06-19T15:48:00.000000Z","ratio2"=>1.36245)
Run Code Online (Sandbox Code Playgroud)

我怎样才能把它一次性弹出到一个数据帧中,而不用一个一个地循环遍历每个字典和键,这样我就有一个如下所示的数据帧:

2×3 DataFrame
? Row ? ratio1  ? ratio2  ? time                        ?
?     ? Float64 ? Float64 ? String                      ?
?????????????????????????????????????????????????????????
? 1   ? 1.36233 ? 1.36243 ? 2014-06-19T15:47:40.000000Z ?
? 2   ? 1.3623  ? 1.36245 ? 2014-06-19T15:48:00.000000Z ?
Run Code Online (Sandbox Code Playgroud)

crs*_*nbr 7

一种方法是

julia> vcat(DataFrame.(data)...)
2×3 DataFrame
? Row ? ratio1  ? ratio2  ? time                        ?
?     ? Float64 ? Float64 ? String                      ?
?????????????????????????????????????????????????????????
? 1   ? 1.36233 ? 1.36243 ? 2014-06-19T15:47:40.000000Z ?
? 2   ? 1.3623  ? 1.36245 ? 2014-06-19T15:48:00.000000Z ?

julia> @btime vcat(DataFrame.($data)...)
  31.146 ?s (157 allocations: 12.19 KiB)
Run Code Online (Sandbox Code Playgroud)

Dict即将每个转换为 aDataFrame并将它们连接起来。

更详细的解释:

  • DataFrame(somedict)是一个构造函数调用,它DataFrame从一个Dict
  • DataFrame.(arrayofdicts):这里的点广播构造函数调用,这样所有包含的Dicts 都转换为DataFrames,我们获得了一个DataFrames数组。有关更多信息,请参阅Julia 文档中的向量化函数的点语法

  • vcat(DataFrame.(arrayofdicts)...):我们现在图示我们的阵列DataFrameS插入vcat功能,垂直(行)连接它们。

  • 一个很好的答案。如果有很多字典,你可以编写“reduce(vcat, DataFrame.(data))”以避免散乱。作为旁注:请注意,您可以对现有的“DataFrame”使用“push!”字典,这应该比首先将其转换为“DataFrame”要快一些。 (2认同)