我有如下所示的数据帧。该表说明了用户在每门课程中观看的模块。
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 =该课程中由多个用户监视的模块列表,并根据该模块上的监视数量(首先是最高监视)对列表进行排序
答案 0 :(得分:3)
将named aggregation
与SeriesGroupBy.nunique
,SeriesGroupBy.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 []