我正在使用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
曾经尝试解决这一问题,但似乎找不到解决方法。我需要更改流派数据的存储方式吗?
我能够找到解决类似问题的this post,但该用户只是想获取每个列表值的计数。这使我到了一半,但我不知道如何使用它来聚合数据框中的另一列。
答案 0 :(得分:1)
通常,您不应该将列表存储在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