熊猫-groupby,其中每行在列表中存储了多个值

时间:2019-02-13 18:53:50

标签: python pandas

我正在使用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,但该用户只是想获取每个列表值的计数。这使我到了一半,但我不知道如何使用它来聚合数据框中的另一列。

1 个答案:

答案 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