【问题标题】:Can I "group by" an array of dictionaries in Julia?我可以按 Julia 中的一系列字典“分组”吗?
【发布时间】:2018-05-07 16:38:42
【问题描述】:

我正在从 JSON 文件中读取数组,因为我需要在将其转换为 DataFrame 以进行进一步操作之前对其执行缩减。为了争论,假设是这样

a = [Dict("A" => 1, "B" => 1, "C" => "a")
     Dict("A" => 1, "B" => 2, "C" => "b")
     Dict("A" => 2, "B" => 1, "C" => "b")
     Dict("A" => 2, "B" => 2, "C" => "a")]

现在,如果我可以按一个或多个键(例如 A 和 C)对数组进行分组,对每个组执行更简单的 reduce,然后将行重新组合成更大的行,那么我正在执行的 reduce 将大大简化Dicts 的数组,然后我可以轻松地变成 DataFrame

一种解决方案是将其转换为DataFrame,将其拆分为组,将各个组转换为矩阵,进行归约(有一些困难,因为现在我已经失去了通过名称引用元素的能力),将简化后的矩阵转回(Sub?)DataFrames(因为名称有些困难),并希望它们能很好地组合成一个巨大的DataFrame

有任何更简单和/或更实用的方法吗?

编辑 在有人建议我查看Query.jl 之前,我正在运行的reduce 返回一个数组,其中行数较少,因为我压缩了某些后续行对。如果我可以用Query.jl 做这样的事情,有人可以暗示如何做,因为文档并不清楚如何“聚合”任何不返回单个值的东西。示例:

 A   B   C
-----------
 1       a
 2   1   a
 3       b
 4   2   b

应该按“C”分组并将该表变成类似的东西

 A   B   C
-----------
 1   1   a
 3   2   b

为了澄清,reduce 是有效的,我只想简化它,在压缩之前不必检查一行是否属于前一行的同一组。

【问题讨论】:

    标签: arrays dictionary dataframe julia reduce


    【解决方案1】:

    它仍处于试验阶段,但SplitApplyCombine.jl 可能会成功。你可以使用任何你想要的键函数对任意迭代进行分组,并在最后得到一个键 -> 组字典。

    julia> ## Pkg.clone("https://github.com/JuliaData/SplitApplyCombine.jl.git")
    
    julia> using SplitApplyCombine
    
    julia> group(x->x["C"], a)
    Dict{Any,Array{Dict{String,Any},1}} with 2 entries:
      "b" => Dict{String,Any}[Dict{String,Any}(Pair{String,Any}("B", 2),Pair{String,Any}("A", 1),Pair{String,Any}("C", "b")), Dict{String,Any}(Pair{String,Any}("…
      "a" => Dict{String,Any}[Dict{String,Any}(Pair{String,Any}("B", 1),Pair{String,Any}("A", 1),Pair{String,Any}("C", "a")), Dict{String,Any}(Pair{String,Any}("…
    

    然后您可以使用标准的[map]reduce 操作(这里使用 SAC @_ 宏进行管道):

    julia> @_ a |> group(x->x["C"], _) |> values(_) |> reduce(vcat, _)
    4-element Array{Dict{String,Any},1}:
     Dict{String,Any}(Pair{String,Any}("B", 2),Pair{String,Any}("A", 1),Pair{String,Any}("C", "b"))
     Dict{String,Any}(Pair{String,Any}("B", 1),Pair{String,Any}("A", 2),Pair{String,Any}("C", "b"))
     Dict{String,Any}(Pair{String,Any}("B", 1),Pair{String,Any}("A", 1),Pair{String,Any}("C", "a"))
     Dict{String,Any}(Pair{String,Any}("B", 2),Pair{String,Any}("A", 2),Pair{String,Any}("C", "a"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-24
      • 2021-03-03
      • 2012-09-25
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      相关资源
      最近更新 更多