将JSON数组读入类似Julia DataFrame的类型

Dan*_*etz 9 dataframe julia

给定一个JSON文件,JSON包很乐意解析它.但是,如果我想将它作为DataFrame(或任何其他柱状数据结构),那么获得它的好方法是什么?

目前,例如,我有:

using JSON
using DataFrames

json_str = """
[{ "color": "red", "value": "#f00" }, { "color": "green", "value": "#0f0" }, 
 { "color": "blue", "value": "#00f" }, { "color": "cyan", "value": "#0ff" }, 
 { "color": "magenta", "value": "#f0f" }, { "color": "yellow", "value": "#ff0" }, 
 { "color": "black", "value": "#000" } ]
  """

function jsontodf(a)
    ka = union([keys(r) for r in a]...)
    df = DataFrame(;Dict(Symbol(k)=>get.(a,k,NA) for k in ka)...)
    return df
end

a = JSON.Parser.parse(json_str)
jsontodf(a)
Run Code Online (Sandbox Code Playgroud)

这导致:

7×2 DataFrames.DataFrame
? Row ? color     ? value  ?
????????????????????????????
? 1   ? "red"     ? "#f00" ?
? 2   ? "green"   ? "#0f0" ?
? 3   ? "blue"    ? "#00f" ?
? 4   ? "cyan"    ? "#0ff" ?
? 5   ? "magenta" ? "#f0f" ?
? 6   ? "yellow"  ? "#ff0" ?
? 7   ? "black"   ? "#000" ?
Run Code Online (Sandbox Code Playgroud)

并且还使用NA处理一些缺少的字段.更干净/更快(Julia v0.6 +)?

Bog*_*ski 6

我已经挖出了这个老问题,现在我们有一个更好的解决方案,从 DataFrames.jl 0.18.0 开始。

如果 JSON 中的所有条目都具有相同的字段,您可以编写:

reduce(vcat, DataFrame.(a))
Run Code Online (Sandbox Code Playgroud)

如果您必须处理每个字典中不同字段的可能性,请编写:

vcat(DataFrame.(a)..., cols=:union)
Run Code Online (Sandbox Code Playgroud)

如果a有很多条目,这可能会有点问题,因为它会飞溅。我刚刚提交了一个 PR,这样你也可以写:

reduce(vcat, DataFrame.(a), cols=:union)
Run Code Online (Sandbox Code Playgroud)

在不远的将来。