Julia Dataframe结合了特定的计算和转换



我需要做一些非常具体的事情,我正在努力以好的方式来做,尤其是我希望它得到优化。

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

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有很多行(,并进行许多计算

我需要计算前1、2、3、4、5的流派、专辑名称、每个用户id的艺术家名称及其各自的值(对应的total_listened(,它必须是这样的:

USER_ID │ ALBUM1_NAME      │ ALBUM2_NAME  | ALBUM1_NAME_VALUE | ALBUM2_NAME_VALUES | ......│ GENRE1       │ GENRE2  

每个user_id一行。

我得到了这个解决方案,它符合我想要的90%,但我不能修改它,也包括total_listened:的值

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.     ......

我在这里只带了GENRE,但我也想要它用于ALUM_NAME,ALUM_ARTIST_NAME

我也想在之后做一个排名靠前的%,按total_listened对用户进行排序,并计算其百分比。按占总数的前5%、前10%、前20%对他们进行排名我可以用计算我想要的分位数

x = .05
quantile(df.TOTAL_LISTENED, x)

然后把所有用户的total_listened放在这个分位数之上但我不知道如何在联合收割机中正确计算。。。

谢谢

正如前一篇文章中所评论的那样,我建议你问一个特定的问题,不要在StackOverflow上重做整个项目(如果你需要这样的帮助https://discourse.julialang.org/是一个很好的讨论场所,尤其是您需要许多分析步骤,并且它们需要对您想要的确切内容进行精确定义,如果https://discourse.julialang.org/您共享了完整的数据集,因为您在这里提供的采样器太小,不足以在以后进行正确的分析(。

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

julia> using Random, DataFrames, Pipe
julia> Random.seed!(1234);
julia> df = DataFrame([rand(1:10, 100), rand('a':'k', 100), rand(100)],
[:USER_ID, :GENRE_MAIN, :TOTAL_LISTENED]);
julia> function top5(sdf, col, prefix)
@pipe groupby(sdf, col) |>
combine(_, :TOTAL_LISTENED => sum => :SUM) |>
sort!(_, :SUM, rev=true) |>
first(_, 5) |>
vcat(_[!, 1], fill(missing, 5 - nrow(_)),
_[!, 2], fill(missing, 5 - nrow(_))) |>
DataFrame([[string(prefix, i) for i in 1:5];
[string(prefix, i, "_VALUE") for i in 1:5]] .=> _)
end;
julia> @pipe groupby(df, :USER_ID) |>
combine(_, x -> top5(x, :GENRE_MAIN, "genre"))
10×11 DataFrame
Row │ USER_ID  genre1  genre2  genre3  genre4  genre5   genre1_VALUE  genre2_VALUE  genre3_VALUE  genre4_VALUE  genre5_VALUE    
│ Int64    Char    Char    Char    Char    Char?    Float64       Float64       Float64       Float64       Float64?        
─────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
1 │       1  d       b       j       e       i             2.34715      2.014         1.68587       0.693472        0.377869
2 │       4  b       e       d       c       missing       0.90263      0.589418      0.263121      0.107839  missing         
3 │       8  c       d       i       k       j             1.55335      1.40416       0.977785      0.779468        0.118024
4 │       2  a       e       f       g       k             1.34841      0.901507      0.87146       0.797606        0.669002
5 │      10  a       e       f       i       d             1.60554      1.07311       0.820425      0.757363        0.678598
6 │       7  f       i       g       c       a             2.59654      1.49654       1.15944       0.670488        0.258173
7 │       9  i       b       e       a       g             1.57373      0.954117      0.603848      0.338918        0.133201
8 │       5  f       g       c       k       d             1.33899      0.722283      0.664457      0.54016         0.507337
9 │       3  d       c       f       h       e             1.63695      0.919088      0.544296      0.531262        0.0540101
10 │       6  d       g       f       j       i             1.68768      0.97688       0.333207      0.259212        0.0636912

最新更新