首页 > 解决方案 > 大熊猫中的Groupby聚合并根据流行度对创建的列表进行排序

问题描述

我有如下所示的数据框。这是解释用户在每门课程上观看的模块的表格。

user_id     course_id       module_id
1           A               1
1           A               2
1           A               3
1           A               4
1           A               5
1           A               6
1           B               5
1           B               8
2           A               8
2           B               5
2           C               6
3           A               2
3           A               3
3           A               9
3           C               10
4           A               3
5           B               5
6           A               3
7           B               5

从上面我想准备下表

course_id          modules             #users        Popular_modules
A                 [1,2,3,4,5,6,8,9]    5             [3,2]
B                 [5,8]                4             [5]
C                 [6,10]               2             []

在哪里

modules = 该课程中的模块列表。

用户 = 观看该课程的用户数。

Popular_modules = 该课程中由多个用户观看的模块列表,并根据该模块上的观看次数对列表进行排序(最初观看次数最多)

标签: pandaspandas-groupby

解决方案


使用named aggregationwithSeriesGroupBy.nuniqueSeriesGroupBy.nunique自定义函数:

def f(x):
    s = x.value_counts()
    return s.index[s.gt(1)].tolist()


df1 = df.groupby("course_id").agg(modules =('module_id','unique'),
                                  users=("user_id","nunique"), 
                                  Popular_modules= ('module_id', f)).reset_index()
print(df1)
  course_id                   modules  users Popular_modules
0         A  [1, 2, 3, 4, 5, 6, 8, 9]      5          [3, 2]
1         B                    [5, 8]      4             [5]
2         C                   [6, 10]      2              []

推荐阅读