Return `DataFrames.jl` 中的最大总和?

Return the maximum sum in `DataFrames.jl`?

假设我的 DataFrame 有两列 vg。首先,我按 g 列对 DataFrame 进行了分组,并计算了 v 列的总和。其次,我使用函数 maximum 来检索最大总和。我想知道是否可以一步检索该值?谢谢。

julia> using Random

julia> Random.seed!(1)
TaskLocalRNG()

julia> dt = DataFrame(v = rand(15), g = rand(1:3, 15))
15×2 DataFrame
 Row │ v          g     
     │ Float64    Int64 
─────┼──────────────────
   1 │ 0.0491718      3
   2 │ 0.119079       2
   3 │ 0.393271       2
   4 │ 0.0240943      3
   5 │ 0.691857       2
   6 │ 0.767518       2
   7 │ 0.087253       1
   8 │ 0.855718       1
   9 │ 0.802561       3
  10 │ 0.661425       1
  11 │ 0.347513       2
  12 │ 0.778149       3
  13 │ 0.196832       1
  14 │ 0.438058       2
  15 │ 0.0113425      1

julia> gdt = combine(groupby(dt, :g), :v => sum => :v)
3×2 DataFrame
 Row │ g      v       
     │ Int64  Float64 
─────┼────────────────
   1 │     1  1.81257
   2 │     2  2.7573
   3 │     3  1.65398

julia> maximum(gdt.v)
2.7572966050340257


我不确定这是否是您的意思,但您可以使用以下命令一步检索 gv 的值:

julia> v, g = findmax(x-> (x.v, x.g), eachrow(gdt))[1]
(4.343050512360169, 3)

DataFramesMeta.jl 有一个 @by 宏:


julia> @by(dt, :g, :sv = sum(:v))
3×2 DataFrame
 Row │ g      sv      
     │ Int64  Float64 
─────┼────────────────
   1 │     1  1.81257
   2 │     2  2.7573
   3 │     3  1.65398

第一部分的语法更简洁。

有了它,您可以执行以下任一操作:

julia> @by(dt, :g, :sv = sum(:v)).sv |> maximum
2.7572966050340257

或(IMO 更具可读性):

julia> @chain dt begin
         @by(:g, :sv = sum(:v))
         maximum(_.sv)
       end
2.7572966050340257