gpt4 book ai didi

dataframe - Julia Dataframe 中的特定案例

转载 作者:行者123 更新时间:2023-12-04 08:28:16 25 4
gpt4 key购买 nike

我需要做一些非常具体的事情,我正在努力以好的方式去做,特别是我希望它得到优化。
所以我有一个如下所示的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com