Dataframe 如何在julia数据帧中对分组记录进行分组和排序

Dataframe 如何在julia数据帧中对分组记录进行分组和排序,dataframe,group-by,julia,rank,Dataframe,Group By,Julia,Rank,在julia中,我想在数据帧中的一列给定的组内生成一个排名,并基于第二列生成排名。我想将每个组中的排名和行数添加到dataframe中的新列中。在按:id分组和按:b排序时,以下内容似乎满足了我的要求(这是否正确?),但我无法为rank列指定名称。在对:id和:b进行排序后,这是否足够有效,或者我应该在循环中执行它?在我的实际数据/应用程序中,我将拥有数百万行和数十万个独特的组 x = DataFrame(id=["a","b","a"

在julia中,我想在数据帧中的一列给定的组内生成一个排名,并基于第二列生成排名。我想将每个组中的排名和行数添加到dataframe中的新列中。在按:id分组和按:b排序时,以下内容似乎满足了我的要求(这是否正确?),但我无法为rank列指定名称。在对:id和:b进行排序后,这是否足够有效,或者我应该在循环中执行它?在我的实际数据/应用程序中,我将拥有数百万行和数十万个独特的组

 x = DataFrame(id=["a","b","a","c","c","a","c","a","a","c"], 
                b=[2,5,7,8,3,9,1,10,4,6], 
                c=["one","two","three","four","five","six","seven","eight","nine","ten"])
 y = combine(groupby(x,:id), sdf -> sort(sdf,:b), s->1:nrow(s), nrow => :n)
这输出结果是正确的,只是我想给'x1'一个类似'rank'的列名:

 Row │ id      b      c       x1     n     
     │ String  Int64  String  Int64  Int64 
─────┼─────────────────────────────────────
   1 │ a           2  one         1      5
   2 │ a           4  nine        2      5
   3 │ a           7  three       3      5
   4 │ a           9  six         4      5
   5 │ a          10  eight       5      5
   6 │ b           5  two         1      1
   7 │ c           1  seven       1      4
   8 │ c           3  five        2      4
   9 │ c           6  ten         3      4
  10 │ c           8  four        4      4

这是给列命名的方法:

julia> combine(groupby(x,:id), sdf -> sort(sdf,:b), s->(rank=1:nrow(s),), nrow => :n)
10×5 DataFrame
 Row │ id      b      c       rank   n
     │ String  Int64  String  Int64  Int64
─────┼─────────────────────────────────────
   1 │ a           2  one         1      5
   2 │ a           4  nine        2      5
   3 │ a           7  three       3      5
   4 │ a           9  six         4      5
   5 │ a          10  eight       5      5
   6 │ b           5  two         1      1
   7 │ c           1  seven       1      4
   8 │ c           3  five        2      4
   9 │ c           6  ten         3      4
  10 │ c           8  four        4      4
或者(这对我来说似乎更干净一点)

(有一个开放的添加选项,可以更轻松地添加行号——如果您觉得这有用,请在此处发表评论)

关于您关于性能的问题,以下可能会更快;在对大数据帧进行一次排序与对小数据帧进行多次排序之间进行权衡:

transform!(groupby(sort(x, [:id, :b]), :id), :id => eachindex => :rank, nrow => :n)

当您在完整数据集上运行此功能时,获得比较反馈会很有趣。

我还没有在完整数据集上运行此功能,但是对于一个包含10万条记录的数据集,每个组通常有一个或几个成员,对大数据框进行一次排序的速度要快三倍多。谢谢你的帮助。
transform!(groupby(sort(x, [:id, :b]), :id), :id => eachindex => :rank, nrow => :n)