Julia Dataframe将特定计算和传输结合起来

Julia Dataframe将特定计算和传输结合起来,dataframe,julia,Dataframe,Julia,我需要做一些非常具体的事情,我正在努力以一种好的方式去做,特别是我希望它得到优化 所以我有一个数据框,看起来像这样: v = ["x","y","z"][rand(1:3, 10)] df = DataFrame(Any[collect(1:10), v, rand(10)], [:USER_ID, :GENRE_MAIN, :TOTAL_LISTENED]) Row │ USER_ID GENRE_MAIN TOTAL_LIS

我需要做一些非常具体的事情,我正在努力以一种好的方式去做,特别是我希望它得到优化

所以我有一个数据框,看起来像这样:

v = ["x","y","z"][rand(1:3, 10)]
df = DataFrame(Any[collect(1:10), v, rand(10)], [:USER_ID, :GENRE_MAIN, :TOTAL_LISTENED])

 Row │ USER_ID  GENRE_MAIN  TOTAL_LISTENED 
     │ Int64    String      Float64        
─────┼─────────────────────────────────────
   1 │       1  x                 0.237186
  12 │       1  y                 0.237186
  13 │       1  x                 0.254486
   2 │       2  z                 0.920804
   3 │       3  y                 0.140626
   4 │       4  x                 0.653306
   5 │       5  x                 0.83126
   6 │       6  x                 0.928973
   7 │       7  y                 0.519728
   8 │       8  x                 0.409969
   9 │       9  z                 0.798064
  10 │      10  x                 0.701332
USER_ID │ ALBUM1_NAME      │ ALBUM2_NAME  | ALBUM1_NAME_VALUE | ALBUM2_NAME_VALUES | ......│ GENRE1       │ GENRE2  
我想按用户聚合它(每个用户有许多行),并进行许多计算

我需要计算每个用户id的前1、2、3、4、5个流派、专辑名、艺术家名及其各自的值(对应的总人数),它必须如下所示:

v = ["x","y","z"][rand(1:3, 10)]
df = DataFrame(Any[collect(1:10), v, rand(10)], [:USER_ID, :GENRE_MAIN, :TOTAL_LISTENED])

 Row │ USER_ID  GENRE_MAIN  TOTAL_LISTENED 
     │ Int64    String      Float64        
─────┼─────────────────────────────────────
   1 │       1  x                 0.237186
  12 │       1  y                 0.237186
  13 │       1  x                 0.254486
   2 │       2  z                 0.920804
   3 │       3  y                 0.140626
   4 │       4  x                 0.653306
   5 │       5  x                 0.83126
   6 │       6  x                 0.928973
   7 │       7  y                 0.519728
   8 │       8  x                 0.409969
   9 │       9  z                 0.798064
  10 │      10  x                 0.701332
USER_ID │ ALBUM1_NAME      │ ALBUM2_NAME  | ALBUM1_NAME_VALUE | ALBUM2_NAME_VALUES | ......│ GENRE1       │ GENRE2  
每个用户标识一行

我得到的这个解决方案符合我想要的90%,但我不能修改它以同时包含total_的值:

using DataFrames, Pipe, Random, Pkg

Pkg.activate(".")
Pkg.add("DataFrames")
Pkg.add("Pipe")

Random.seed!(1234)

df = DataFrame(USER_ID=rand(1:10, 80),
               GENRE_MAIN=rand(string.("genre_", 1:6), 80),
               ALBUM_NAME=rand(string.("album_", 1:6), 80),
               ALBUM_ARTIST_NAME=rand(string.("artist_", 1:6), 80))

function top5(sdf, col, prefix)
    return @pipe groupby(sdf, col) |>
                 combine(_, nrow) |>
                 sort!(_, :nrow, rev=true) |>
                 first(_, 5) |>
                 vcat(_[!, 1], fill(missing, 5 - nrow(_))) |>
                 DataFrame([string(prefix, i) for i in 1:5] .=> _)
end

@pipe groupby(df, :USER_ID) |>
      combine(_,
              x -> top5(x, :GENRE_MAIN, "genre"),
              x -> top5(x, :ALBUM_NAME, "album"), 
              x -> top5(x, :ALBUM_ARTIST_NAME, "artist"))
例如:

对于刚刚出现的DataFrame的用户1,我希望结果是:

 Row │ USER_ID  GENRE1  GENRE2   GENRE1_VALUE GENRE2_VALUE   ......
     │ Int64    String  String    Float64     Float64      
─────┼─────────────────────────────────────────────────────
   1 │       1  x         y       0.491672    0.237186.     ......
我在这里只选了一个流派,但我也希望专辑名,专辑名,艺术家名

我还想以后做一个排名靠前的%, 按所听的总数对用户进行排序,并计算其百分比。 按总数的前5%、前10%、前20%对其进行排名 我可以计算我想要的标记分位数

x = .05
quantile(df.TOTAL_LISTENED, x)
然后把所有用户的总听音放在这个分位数上 但我不知道如何在联合收割机中正确计算它


谢谢你

正如在上一篇文章中所评论的那样-我建议你问一个具体的问题,不要在StackOverflow上重做你的整个项目(如果您需要这样的帮助,这是一个讨论的好地方,尤其是您需要分析的许多步骤,并且这些步骤需要精确定义您想要的内容-而且最好是在您共享完整的数据集,因为您提供的采样器太小,不足以在以后进行适当的分析)

下面是一个如何添加总计列的示例(我假设您希望数据按总计排序):


我明白,我只是想尽可能多地解释。谢谢你的帮助我知道-但问题是你在一个问题中问了很多问题,这不符合StackOverflow格式。对话(当你可以制作讨论线程时)更适合这种帮助。没问题,只是很难使用StackOverflow来提供这种支持。