给定一个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)
导致:
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" │
并使用NA处理一些缺少的字段。更干净/更快(Julia v0.6 +)?
答案 0 :(得分:2)
我已经解决了这个老问题,现在从DataFrames.jl 0.18.0开始我们有了更好的解决方案。
如果JSON中的所有条目都具有相同的字段,则可以编写:
reduce(vcat, DataFrame.(a))
如果您必须处理每个字典中不同字段的可能性,请输入:
vcat(DataFrame.(a)..., cols=:union)
如果a
像泼溅一样有很多条目,这可能会有点问题。我刚刚提交了一份PR,以便您也可以写:
reduce(vcat, DataFrame.(a), cols=:union)
在不久的将来。