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

11
给定一个 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"

同时还可以处理一些缺失的字段并将其替换为NAs。是否有更简洁/更快的方法(适用于Julia v0.6+)?


1
请检查一下 https://github.com/johnmyleswhite/DataFramesIO.jl/commit/439de4aaf3807445599e70859c6563d0a9c39742 ,不过我也想知道这个问题的解决方案。 - Rahul
1
@RahulLakhanpal DataFramesIO似乎有相同的目的,但我不确定这个包是否适用于v0.6。 - Dan Getz
此外,它本身没有处理 NA 值的支持。 - Rahul
下面的答案很好用。您能否接受它,以便更容易被机器人和搜索引擎找到? - cmc
1个回答

7

我挖出了这个老问题,现在随着DataFrames.jl 0.18.0的推出,我们有了更好的解决方案。

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

reduce(vcat, DataFrame.(a))

如果你需要处理每个字典中可能不同的字段,那么请按照以下方式编写代码:
vcat(DataFrame.(a)..., cols=:union)

如果 a 中有很多条目,那么这可能会稍微有些问题,因为它会进行展开。我刚刚提交了一个 PR,这样你也可以写:

reduce(vcat, DataFrame.(a), cols=:union)

在不久的将来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接