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

2024-03-26

给定一个 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+)?


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

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

reduce(vcat, DataFrame.(a))

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

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

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

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

在不远的将来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 JSON 数组读入类似 Julia DataFrame 的类型 的相关文章

随机推荐