Julia DataFrames.jl双重分组依据



最近我真的很难解决这个问题,我想也许有人可以帮我,问题是:

我有一个数据帧来表示客户端听什么(音乐),一个user_key=一个客户端,一个客户端可以有很多行。我有很多专栏,比如流媒体的日期、客户收听的类型、专辑名称。。。。以及一个名为TOTAL_LISTEED的列,表示该客户端收听专辑的时间、在哪个应用程序上等。

1000×9 DataFrame. Omitted printing of 2 columns
│ Row  │ USER_KEY                         │ STREAM_DATE │ GENRE_MAIN        │ ALBUM_NAME                                           │ ALBUM_ARTIST_NAME              │ APP_SHORT_NAME │ USER_TRIAL_STATUS │
│      │ String                           │ Dates.Date  │ String            │ String                                               │ String                         │ String         │ Bool              │
├──────┼──────────────────────────────────┼─────────────┼───────────────────┼──────────────────────────────────────────────────────┼────────────────────────────────┼────────────────┼───────────────────┤
│ 1    │ 0000e19d6a5608e3787e5bfea98488ca │ 2021-01-16  │ CLASSICAL         │ The Liszt Collection                                 │ VARIOUS ARTISTS                │ app_1          │ 0                 │
│ 2    │ 0000e19d6a5608e3787e5bfea98488ca │ 2021-01-19  │ CLASSICAL         │ Schumann: Music for Clarinet                         │ PATRICK MESSINA                │ app_1          │ 0                 │
│ 3    │ 0000e19d6a5608e3787e5bfea98488ca │ 2021-01-16  │ CLASSICAL         │ Schumann: Music for Clarinet                         │ PATRICK MESSINA                │ app_1          │ 0                 │
│ 4    │ 0000e19d6a5608e3787e5bfea98488ca │ 2020-12-28  │ JAZZ              │ Turn Up The Quiet                                    │ DIANA KRALL                    │ app_2          │ 0                 │
│ 5    │ 0000e19d6a5608e3787e5bfea98488ca │ 2021-01-03  │ CLASSICAL         │ Johann Sebastian Bach                                │ VÍKINGUR ÓLAFSSON              │ app_1          │ 0                 │
│ 6    │ 0000e19d6a5608e3787e5bfea98488ca │ 2021-01-20  │ CLASSICAL         │ Barbara Bonney - The Radiant Voice of Barbara Bonney │ BARBARA BONNEY                 │ app_1          │ 0                 │
│ 7    │ 0000e19d6a5608e3787e5bfea98488ca │ 2020-12-22  │ CLASSICAL         │ The Liszt Collection                                 │ VARIOUS ARTISTS                │ app_1          │ 0                 │
⋮
│ 993  │ 000a149099a55a6e74fd253ab3f5709d │ 2020-12-30  │ CLASSICAL         │ Handel: Concerti grossi, Op. 6 Nos. 1-6              │ AKADEMIE FÜR ALTE MUSIK BERLIN │ app_2          │ 0                 │
│ 994  │ 000a149099a55a6e74fd253ab3f5709d │ 2021-01-01  │ SOUL / FUNK / R&B │ Gold - 20 Super Hits (International)                 │ BONEY M.                       │ app_2          │ 0                 │
│ 995  │ 000a149099a55a6e74fd253ab3f5709d │ 2020-12-25  │ SOUL / FUNK / R&B │ Gold - 20 Super Hits (International)                 │ BONEY M.                       │ app_2          │ 0                 │
│ 996  │ 000a149099a55a6e74fd253ab3f5709d │ 2021-01-08  │ CLASSICAL         │ Vivaldi: Concertos For Two Violins                   │ VIKTORIA MULLOVA               │ app_2          │ 0                 │
│ 997  │ 000a149099a55a6e74fd253ab3f5709d │ 2021-01-09  │ CLASSICAL         │ Wagner: Tannhäuser                                   │ GIUSEPPE SINOPOLI              │ app_6          │ 0                 │
│ 998  │ 000a149099a55a6e74fd253ab3f5709d │ 2021-01-17  │ CLASSICAL         │ Cyrillus Kreek - The Suspended Harp of Babel         │ VOX CLAMANTIS                  │ app_2          │ 0                 │
│ 999  │ 000a149099a55a6e74fd253ab3f5709d │ 2020-12-25  │ REGGAE            │ Exodus 30th Anniversary Edition                      │ BOB MARLEY & THE WAILERS       │ app_2          │ 0                 │
│ 1000 │ 000a149099a55a6e74fd253ab3f5709d │ 2021-01-08  │ CLASSICAL         │ Double concertos                                     │ SIMON STANDAGE                 │ app_2          │ 0                 │

total_listened没有在这里打印,所以我把它放在下面

df[:TOTAL_LISTENED]
1000-element Array{Float64,1}:
4161.0
3909.0
3465.0
2172.0
2040.0
1742.0
1666.0
1646.0
1513.0
1450.0
⋮
659.0
653.0
652.0
652.0
650.0
649.0
647.0
643.0
642.0

我希望每个客户端按每列进行聚合,并计算这个total_listened的总和。

例如,假设客户"0000e19d6a5608e3787e5bfea98488ca",我想知道他听了多少类型的经典音乐,听了多少专辑《舒曼:单簧管音乐》等。

我需要对user_key和其他列进行双重分组,然后对total_listened列求和,但我无法使其工作。

当我尝试在groupby内部进行groupby时,它会告诉我不能在groupedDataFrame中进行groupby。

此外,我真的不知道如何轻松地复制这个数据帧,如果你愿意,我可以直接与你分享CSV。

我想要的结果:

genre_main->我按user_key分组,genre_main然后对total_listened求和,这给了我每个流派的total_litened,然后我只想保留>用户收听总数的33%(所有>33%的流派都在一列中,由","分隔为字符串)。

app_short_name->与genre_main完全相同。

白蛋白名称->只需获得排名前1的专辑(我想我知道如何做到这一点,只需按专辑名称分组时求和total_listened,然后先进行排序|>)

非常感谢

首先,请将DataFrames.jl更新到最新版本0.22,以获得包的最新功能和错误修复。

要获得按流派收听的总数,请执行:

combine(groupby(df, [:USER_KEY, :GENRE_MAIN]), :TOTAL_LISTENED => sum)

要获得专辑的总收听量,只需执行:

combine(groupby(df, [:USER_KEY, :ALBUM_NAME]), :TOTAL_LISTENED => sum)

这就是你要找的吗?

编辑:

genre_main->我按user_key分组,genre_main然后对total_listened求和,这给了我每个流派的total_litened,然后我只想保留>用户收听总数的33%(所有>33%的流派都在一列中,由","分隔为字符串)

可以这样做:

using Chain # to make reading the pipe easier
@chain df begin
groupby(:USER_KEY)
transform(:TOTAL_LISTENED => (x -> x ./ sum(x) => :FRACTION_LISTENED)
groupby([:USER_LISTENED, :GENRE_MAIN])
combine(:FRACTION_LISTENED => sum => :FRACTION_LISTENED)
filter(:FRACTION_LISTENED => >=(0.33), _)
groupby(:USER_LISTENED)
combine(:GENRE_MAIN => (x -> join(x, ",")) => :FREQUENT_GENRES)
end

我是凭头脑写的,但这就是我的方式。因此,您将获得一个具有两列:USER_LISTENED:FREQUENT_GENRES的数据帧。我想你可以类似地做问题的第二部分,然后加入:USER_LISTENED上的结果。

最新更新