大熊猫:从多个列中计数值

时间:2019-02-04 10:26:03

标签: python pandas

我目前正在做一个项目,我需要计算每年每种类型的受欢迎程度。数据集为我提供了电影,但是每部电影都可以具有多个流派,如下面的示例df所示(也有杂乱的格式流派,用“ |”分隔)

    release_year                                     genres
0          2015  Action|Adventure|Science Fiction|Thriller
1          2015  Action|Adventure|Science Fiction|Thriller
2          2015         Adventure|Science Fiction|Thriller
3          2015   Action|Adventure|Science Fiction|Fantasy
4          2015                      Action|Crime|Thriller

我的第一步是将每个流派分成不同的列,以便使用str.split来处理干净的数据

df[['Genre_1','Genre_2','Genre_3','Genre_4','Genre_5']] = df['genres'].str.split("|",expand=True)

    release_year   Genre_1          Genre_2          Genre_3   Genre_4  Genre_5
0          2015     Action        Adventure  Science Fiction  Thriller    None
1          2015     Action        Adventure  Science Fiction  Thriller    None
2          2015  Adventure  Science Fiction         Thriller      None    None
3          2015     Action        Adventure  Science Fiction   Fantasy    None
4          2015     Action            Crime         Thriller      None    None

由于每部电影都有多部电影,我该如何使用groupby语句来计算每种类型的流行度?看来我想折叠所有展开的列,但保持每个列的年份为键,理想情况下会导致如下所示:

    release_year   All genres
0          2015     Action 
1          2015     Action 
2          2015  Adventure
3          2015     Action
4          2015     Action

我非常感谢您对此提供的任何帮助。 非常感谢!

1 个答案:

答案 0 :(得分:1)

我想以下内容将为您提供所需的输出。

df = pd.DataFrame(
    [
        [2015, 'Action|Adventure|Science Fiction|Thriller'],
        [2015, 'Action|Adventure|Science Fiction|Thriller'],
        [2015, ' Action|Crime|Thriller']
    ],
    columns=['release_year', 'genres']

)
df2 = df['genres'].str.split('|').apply(pd.Series)
df2.index = df.set_index(['release_year']).index
df2.stack().reset_index(['release_year']).rename(columns={0: 'All Genres'})

输出:

   release_year       All Genres
0          2015           Action
1          2015        Adventure
2          2015  Science Fiction
3          2015         Thriller
0          2015           Action
1          2015        Adventure
2          2015  Science Fiction
3          2015         Thriller
0          2015           Action
1          2015            Crime
2          2015         Thriller