[英]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.