Julia Dataframe中的特殊情况

Julia Dataframe中的特殊情况,dataframe,julia,Dataframe,Julia,我需要做一些非常具体的事情,我正在努力以一种好的方式去做,特别是我希望它得到优化 所以我有一个数据框,看起来像这样: │ Row │ USER_ID │ GENRE_MAIN │ ALBUM_NAME │ ALBUM_ARTIST_NAME │ TOTAL_LISTENED │ TOTAL_COUNT_LISTENED

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

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

│ Row      │ USER_ID │ GENRE_MAIN        │ ALBUM_NAME                                                                  │ ALBUM_ARTIST_NAME              │ TOTAL_LISTENED │ TOTAL_COUNT_LISTENED │
│          │ String  │ String            │ String                                                                      │ String                         │ DecFP.Dec128   │ DecFP.Dec128         │
├──────────┼─────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────────┼────────────────────────────────┼────────────────┼──────────────────────┤
│ 1        │ 9s2dsdd6  │ ROCK              │ The Thought's Boy                                                       │ AARON MADISON                  │ 5912.0         │ 91.0                 │
│ 1        │ 9s2dsdd6  │ ROCK              │ The wqeqwewe                                                          │ AARON MADISON                  │ 3212.0         │ 91.0                 │
│ 2        │ 11sdasd63 │ ROCK              │ Down On The Upside                                                          │ SOUNDGARDEN                    │ 3354.0         │ 14.0                 │
│ 3        │ 112sds334 │ CLASSICAL         │ Beethoven: Symphonies Nos. 1 & 2 - C.P.E. Bach: Symphonies, Wq 175 & 183/17 │ AKADEMIE FÜR ALTE MUSIK BERLIN │ 1372.0         │ 4.0                  │
│ 4        │ 145sdsd42 │ POP               │ My Life in the Bush of Ghosts                                               │ BRIAN ENO                      │ 3531.0         │ 17.0                 │
USER_ID │ ALBUM1_NAME      │ ALBUM2_NAME  ......│ GENRE1       │ GENRE2  
我想按用户聚合它(每个用户有许多行),并进行许多计算 我正在用这个做聚合:

gdf = DataFrames.groupby(df, :USER_ID)
combine(gdf,:TOTAL_LISTENED => sum => :TOTAL_SECONDS_LISTENED,
            :TOTAL_COUNT_LISTENED => sum => :TOTAL_TRACKS_LISTENED)
我需要计算每个用户id的前1、2、3、4、5个流派、专辑名、艺术家名,它必须如下所示:

│ Row      │ USER_ID │ GENRE_MAIN        │ ALBUM_NAME                                                                  │ ALBUM_ARTIST_NAME              │ TOTAL_LISTENED │ TOTAL_COUNT_LISTENED │
│          │ String  │ String            │ String                                                                      │ String                         │ DecFP.Dec128   │ DecFP.Dec128         │
├──────────┼─────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────────┼────────────────────────────────┼────────────────┼──────────────────────┤
│ 1        │ 9s2dsdd6  │ ROCK              │ The Thought's Boy                                                       │ AARON MADISON                  │ 5912.0         │ 91.0                 │
│ 1        │ 9s2dsdd6  │ ROCK              │ The wqeqwewe                                                          │ AARON MADISON                  │ 3212.0         │ 91.0                 │
│ 2        │ 11sdasd63 │ ROCK              │ Down On The Upside                                                          │ SOUNDGARDEN                    │ 3354.0         │ 14.0                 │
│ 3        │ 112sds334 │ CLASSICAL         │ Beethoven: Symphonies Nos. 1 & 2 - C.P.E. Bach: Symphonies, Wq 175 & 183/17 │ AKADEMIE FÜR ALTE MUSIK BERLIN │ 1372.0         │ 4.0                  │
│ 4        │ 145sdsd42 │ POP               │ My Life in the Bush of Ghosts                                               │ BRIAN ENO                      │ 3531.0         │ 17.0                 │
USER_ID │ ALBUM1_NAME      │ ALBUM2_NAME  ......│ GENRE1       │ GENRE2  
每个用户标识一行

因此,我尝试使用countmap进行排序,只保留前5位,并将每个值分配给数据帧中的一列

transposed = sort(countmap(targetId[targetCol]), byvalue=true, rev=true) 

for (i, g) in enumerate(eachcol(transposed))
        rVal["ALBUM$(i)_NAME"] = g[1]
        rVal["ALBUM$(i)_ARTIST"] = g[3]
        rVal["ALBUM$(i)_TIME"] = g[2]
        rVal["ALBUM$(i)_ID"] = "ID"
        rVal["USER_ID"] = id
    end
但它在联合收割机中不起作用,它只是非常难看,我相信我可以用更好的方法

我希望这是可以理解的,如果有人能帮助我,请=)

多谢各位

编辑:再现数据帧的一种方法:

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

您没有提供一种简单的方法来复制源数据,因此我正在从头开始编写解决方案,希望我没有犯任何错误(请注意,您需要DataFrames.jl 0.22才能正常工作,而您似乎使用的是该软件包的某些旧版本):

代码有点复杂,因为我们必须处理每个组可能少于5个条目的事实

它根据Julia 1.5.3产生:

10×16 DataFrame
 Row │ USER_ID  genre1   genre2   genre3   genre4   genre5   album1   album2   album3   album4   album5   artist1   artist2   artist3   artist4   artist5
     │ Int64    String   String   String   String?  String?  String   String   String   String   String?  String    String    String    String?   String?
─────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1 │       1  genre_1  genre_3  genre_5  genre_2  genre_4  album_3  album_5  album_6  album_1  album_4  artist_1  artist_4  artist_3  artist_2  artist_6
   2 │       4  genre_1  genre_3  genre_6  genre_2  missing  album_2  album_4  album_5  album_6  missing  artist_4  artist_5  artist_2  missing   missing
   3 │       8  genre_2  genre_1  genre_6  genre_5  missing  album_1  album_5  album_4  album_2  missing  artist_5  artist_6  artist_4  artist_1  artist_3
   4 │       2  genre_1  genre_5  genre_2  genre_4  genre_3  album_6  album_3  album_4  album_2  album_1  artist_4  artist_2  artist_6  artist_1  artist_5
   5 │      10  genre_5  genre_3  genre_6  genre_4  genre_2  album_2  album_3  album_1  album_5  album_4  artist_1  artist_6  artist_2  artist_5  artist_3
   6 │       7  genre_5  genre_3  genre_2  genre_4  genre_1  album_2  album_4  album_3  album_5  missing  artist_4  artist_1  artist_3  artist_5  missing
   7 │       9  genre_3  genre_4  genre_2  missing  missing  album_1  album_3  album_4  album_2  missing  artist_4  artist_2  artist_6  artist_3  missing
   8 │       5  genre_2  genre_3  genre_4  genre_6  missing  album_2  album_1  album_3  album_4  missing  artist_6  artist_5  artist_4  artist_1  missing
   9 │       3  genre_6  genre_5  genre_4  genre_2  genre_1  album_3  album_4  album_1  album_5  missing  artist_4  artist_3  artist_6  artist_5  missing
  10 │       6  genre_3  genre_4  genre_1  genre_6  missing  album_2  album_4  album_5  album_3  missing  artist_4  artist_6  artist_5  missing   missing

我想你想要的?

是的,对不起,我会用更好的源数据编辑这个问题,我得到错误:MethodError:没有方法匹配combine(::GroupedDataFrame{DataFrame},::var“#19#22”,::var“#20#23”,::var“#21#24”)当我尝试执行您的解决方案时,您知道为什么吗?是的-我知道-您不在DataFrames.jl 0.22上-请参阅我在回答中给出的注释。请先将软件包更新到最新版本。很抱歉,即使使用dataframe 0.22=(我添加了dataframe#master),okI仍然有相同的错误是的,我也必须升级julia,但现在它可以工作了,非常感谢它非常整洁。您的编辑包含不同的变量名,因此我的解决方案不会对它起作用,因为它使用您的原始变量名。