Julia Groupby 均值计算

Julia Groupby with mean calculation

我有这个数据框:

d=DataFrame(class=["A","A","A","B","C","D","D","D"],
            num=[10,20,30,40,20,20,13,12], 
            last=[3,5,7,9,11,13,100,12])

我想做一个groupby。在 Python 我会做:

d.groupby('class')[['num','last']].mean()

如何在 Julia 中执行相同的操作?

我正在尝试使用 combinegroupby,但到目前为止没有成功。

更新:我设法这样做了:

gd = groupby(d, :class)
combine(gd, :num => mean, :last => mean)

有什么更好的方法吗?

这取决于您所说的“更好的方法”是什么意思。您可以像这样将相同的函数应用于多个列:

combine(gd, [:num, :last] .=> mean)

或者如果您有很多列,例如想要将 mean 应用于除分组列之外的所有列,您可以这样做:

combine(gd, Not(:class) .=> mean)

或(如果您想避免记住分组的列)

combine(gd, valuecols(gd) .=> mean)

这些是基本架构。现在另一个问题是如何为目标列命名。默认情况下,他们会得到一个 "source_function" 形式的名称,如下所示:

julia> combine(gd, [:num, :last] .=> mean)
4×3 DataFrame
 Row │ class   num_mean  last_mean
     │ String  Float64   Float64
─────┼─────────────────────────────
   1 │ A           20.0     5.0
   2 │ B           40.0     9.0
   3 │ C           20.0    11.0
   4 │ D           15.0    41.6667

您可以像这样保留原始列名称(有时首选):

julia> combine(gd, [:num, :last] .=> mean, renamecols=false)
4×3 DataFrame
 Row │ class   num      last
     │ String  Float64  Float64
─────┼──────────────────────────
   1 │ A          20.0   5.0
   2 │ B          40.0   9.0
   3 │ C          20.0  11.0
   4 │ D          15.0  41.6667

或者像这样:

julia> combine(gd, [:num, :last] .=> mean .=> identity)
4×3 DataFrame
 Row │ class   num      last
     │ String  Float64  Float64
─────┼──────────────────────────
   1 │ A          20.0   5.0
   2 │ B          40.0   9.0
   3 │ C          20.0  11.0
   4 │ D          15.0  41.6667

最后一个示例向您展示了您可以将任何函数作为最后一部分传递给字符串并生成目标列名称,因此您可以:

julia> combine(gd, [:num, :last] .=> mean .=> col -> "prefix_" * uppercase(col) * "_suffix")
4×3 DataFrame
 Row │ class   prefix_NUM_suffix  prefix_LAST_suffix
     │ String  Float64            Float64
─────┼───────────────────────────────────────────────
   1 │ A                    20.0              5.0
   2 │ B                    40.0              9.0
   3 │ C                    20.0             11.0
   4 │ D                    15.0             41.6667

编辑

单行操作:

你可以这样做:

combine(groupby(d, :class), [:num, :last] .=> mean)

groupby(d, :class) 存储在变量中的好处是您执行一次分组,然后可以多次重复使用结果对象,从而加快速度。

此外,如果您使用 DataFrmesMeta.jl,您可以这样写:

@chain d begin
    groupby(:class)
    combine([:num, :last] .=> mean)
end

打字比较多,但这是来自 R 的人倾向于喜欢的风格。