dataframe - Julia Dataframe 中的具体案例

标签 dataframe julia

我需要做一些非常具体的事情,并且我正在尝试以好的方式去做,特别是我希望对其进行优化。

所以我有一个看起来像这样的 DataFrame :

│ 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 有很多行)并进行很多计算 我正在用这个进行聚合:

gdf = DataFrames.groupby(df, :USER_ID)
combine(gdf,:TOTAL_LISTENED => sum => :TOTAL_SECONDS_LISTENED,
            :TOTAL_COUNT_LISTENED => sum => :TOTAL_TRACKS_LISTENED)

我需要计算每个 user_id 的前 1 ,2 ,3 ,4 ,5 流派、专辑名称、艺术家姓名,它必须是这样的:

USER_ID │ ALBUM1_NAME      │ ALBUM2_NAME  ......│ GENRE1       │ GENRE2  

每个 user_id 一行。

所以我尝试使用计数图来完成此操作,然后对其进行排序,仅保留前 5 个值,并将每个值分配给 Dataframe 中的一列

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

但它在联合收割机中不起作用,它非常丑陋,我确信我可以做得更好。

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

谢谢

编辑:重现 DataFrame 的方法:

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 才能正常工作,而您似乎位于某些旧版本的软件包上):

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"))

代码有点复杂,因为我们必须处理每组可能少于 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

我想你想要哪个?

关于dataframe - Julia Dataframe 中的具体案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65152332/

相关文章:

python - 将月的数量平均分配到周 (2)

matplotlib - 使用 Julia 和 PyPlot 绘制球体

r - Julia 相当于 dplyr 的 bind_cols 和 bind_rows

python - 使用包含嵌套 JSON 字符串的一列解析 Pandas DataFrame 中的列

R:将列联表转换为长数据框

concurrency - Julia 语言 - @async tasks::Current-Directory 中的状态

Julia 控制流 bool 值未按预期工作

arrays - Julia /元胞自动机 : efficient way to get neighborhood

r - 如何根据r中的日期/天拆分和制作新的csv文件?

python - Pandas 列内容到新列,与其他原始列