Julia Groupby 的均值计算

mer*_*low 1 dataframe julia dataframes.jl

我有这个数据框:

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])
Run Code Online (Sandbox Code Playgroud)

我想做一个groupby。在Python中我会这样做:

d.groupby('class')[['num','last']].mean()
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 Julia 中做同样的事情?

我正在尝试使用一些东西combinegroupby但到目前为止还没有成功。

更新:我设法这样做:

gd = groupby(d, :class)
combine(gd, :num => mean, :last => mean)
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法呢?

Bog*_*ski 6

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

\n
combine(gd, [:num, :last] .=> mean)\n
Run Code Online (Sandbox Code Playgroud)\n

或者,如果您有很多列,例如想要应用于mean除分组列之外的所有列,您可以执行以下操作:

\n
combine(gd, Not(:class) .=> mean)\n
Run Code Online (Sandbox Code Playgroud)\n

或者(如果您想避免记住哪一列正在分组)

\n
combine(gd, valuecols(gd) .=> mean)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
julia> combine(gd, [:num, :last] .=> mean)\n4\xc3\x973 DataFrame\n Row \xe2\x94\x82 class   num_mean  last_mean\n     \xe2\x94\x82 String  Float64   Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 A           20.0     5.0\n   2 \xe2\x94\x82 B           40.0     9.0\n   3 \xe2\x94\x82 C           20.0    11.0\n   4 \xe2\x94\x82 D           15.0    41.6667\n
Run Code Online (Sandbox Code Playgroud)\n

您可以保留原始列名称,如下所示(有时这是首选):

\n
julia> combine(gd, [:num, :last] .=> mean, renamecols=false)\n4\xc3\x973 DataFrame\n Row \xe2\x94\x82 class   num      last\n     \xe2\x94\x82 String  Float64  Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 A          20.0   5.0\n   2 \xe2\x94\x82 B          40.0   9.0\n   3 \xe2\x94\x82 C          20.0  11.0\n   4 \xe2\x94\x82 D          15.0  41.6667\n
Run Code Online (Sandbox Code Playgroud)\n

或者像这样:

\n
julia> combine(gd, [:num, :last] .=> mean .=> identity)\n4\xc3\x973 DataFrame\n Row \xe2\x94\x82 class   num      last\n     \xe2\x94\x82 String  Float64  Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 A          20.0   5.0\n   2 \xe2\x94\x82 B          40.0   9.0\n   3 \xe2\x94\x82 C          20.0  11.0\n   4 \xe2\x94\x82 D          15.0  41.6667\n
Run Code Online (Sandbox Code Playgroud)\n

最后一个示例向您展示,您可以传递任何函数作为处理字符串并生成目标列名称的最后一部分,因此您可以执行以下操作:

\n
julia> combine(gd, [:num, :last] .=> mean .=> col -> "prefix_" * uppercase(col) * "_suffix")\n4\xc3\x973 DataFrame\n Row \xe2\x94\x82 class   prefix_NUM_suffix  prefix_LAST_suffix\n     \xe2\x94\x82 String  Float64            Float64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82 A                    20.0              5.0\n   2 \xe2\x94\x82 B                    40.0              9.0\n   3 \xe2\x94\x82 C                    20.0             11.0\n   4 \xe2\x94\x82 D                    15.0             41.6667\n
Run Code Online (Sandbox Code Playgroud)\n

编辑

\n

在一行中执行操作:

\n

你可以这样做:

\n
combine(groupby(d, :class), [:num, :last] .=> mean)\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

另外,如果您使用 DataFrmesMeta.jl 您可以编写例如:

\n
@chain d begin\n    groupby(:class)\n    combine([:num, :last] .=> mean)\nend\n
Run Code Online (Sandbox Code Playgroud)\n

这是更多的打字,但这是来自 R 的人往往喜欢的风格。

\n