我可以在朱莉娅“分组”一系列词典吗?

时间:2017-11-23 16:45:30

标签: arrays dictionary dataframe julia reduce

我正在读取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会大大简化。 Dict的数组,然后我可以很容易地变成DataFrame

一种解决方案是将其转换为DataFrame,将其拆分为组,将单个组转换为矩阵,进行缩减(有一些困难,因为现在我已经失去了通过引用元素的能力他们的名字,将缩小的矩阵转回(Sub?)DataFrame s(由于名称有些困难),并希望它们很好地融合到一个巨人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

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

1 个答案:

答案 0 :(得分:0)

它仍处于试验阶段,但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"))