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 中执行相同的操作?
我正在尝试使用 combine
和 groupby
,但到目前为止没有成功。
更新:我设法这样做了:
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 的人倾向于喜欢的风格。
我有这个数据框:
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 中执行相同的操作?
我正在尝试使用 combine
和 groupby
,但到目前为止没有成功。
更新:我设法这样做了:
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 的人倾向于喜欢的风格。