簡體   English   中英

Pandas - groupby,其中每行都有多個存儲在列表中的值

[英]Pandas - groupby where each row has multiple values stored in list

我正在處理 last.fm 監聽數據,並且有一個如下所示的 DataFrame:

           Artist Plays                                   Genres
0   John Coltrane    10             [jazz, modal jazz, hard bop]
1     Miles Davis    15  [jazz, cool jazz, modal jazz, hard bop]
2  Charlie Parker    20                            [jazz, bebop]

我想按流派對數據進行分組,然后按每個流派的播放總和進行聚合,以獲得如下內容:

        Genre Plays
0        jazz    45
1  modal jazz    25
2    hard bop    25
3       bebop    20
4   cool jazz    15

一直試圖解決這個問題一段時間,但似乎無法找到解決方案。 我是否需要更改類型數據的存儲方式?

我能夠找到解決類似問題的這篇文章,但該用戶只想獲取每個列表值的計數。 這讓我走到了一半,但我不知道如何使用它來聚合數據幀中的另一列。

一般來說,你不應該在DataFrame存儲列表,所以是的,最好改變它們的存儲方式。 有了這個,你可以使用一些join + str.get_dummies + .multiply 選擇一個不會出現在任何字符串中的sep

sep = '*'
df.Genres.apply(sep.join).str.get_dummies(sep=sep).multiply(df.Plays, axis=0).sum()

輸出

bebop         20
cool jazz     15
hard bop      25
jazz          45
modal jazz    25
dtype: int64

一種更容易使用的形式是,如果您的列表跨行拆分,如下所示:

import pandas as pd
df1 = pd.concat([pd.DataFrame(df.Genres.values.tolist()).stack().reset_index(1, drop=True).to_frame('Genres'),
                 df[['Plays', 'Artist']]], axis=1)

       Genres  Plays          Artist
0        jazz     10   John Coltrane
0  modal jazz     10   John Coltrane
0    hard bop     10   John Coltrane
1        jazz     15     Miles Davis
1   cool jazz     15     Miles Davis
1  modal jazz     15     Miles Davis
1    hard bop     15     Miles Davis
2        jazz     20  Charlie Parker
2       bebop     20  Charlie Parker

使其成為流派中的簡單總和:

df1.groupby('Genres').Plays.sum()

Genres
bebop         20
cool jazz     15
hard bop      25
jazz          45
modal jazz    25
Name: Plays, dtype: int64

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM