我有如下所示的数据框。该表说明了用户在每门课程中观看的模块。
user_id course_id module_id
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
1 2 5
1 2 8
2 1 8
2 2 5
2 3 6
3 1 2
3 1 3
3 1 9
3 3 10
根据以上数据,我想准备下表。
预期产量:
user_id courses Num_ofcourses Total Total_Modules
1 [1,2] 2 {1:[1,2,3,4,5,6], 2:[5,8]} 8
2 [1,2,3] 3 {1:[8], 2:[5], 3:[6]} 3
3 [1,3] 2 {1:[2,3,9], 3:[10]} 4
想法是先创建嵌套的字典对于Total
柱,然后聚集GroupBy.agg
带SeriesGroupBy.unique
,SeriesGroupBy.nunique
并GroupBy.size
和最后添加新列的DataFrame.insert
和Index.map
:
s = df.groupby(['user_id','course_id'])['module_id'].apply(list)
d = {x: s.xs(x).to_dict() for x in s.index.levels[0]}
df1 = df.groupby('user_id').agg(courses=('course_id','unique'),
Num_ofcourses=('course_id','nunique'),
Total_Modules=('module_id','size'))
df1.insert(2, 'Total', df1.index.map(d))
df1 = df1.reset_index()
print (df1)
user_id courses Num_ofcourses Total \
0 1 [1, 2] 2 {1: [1, 2, 3, 4, 5, 6], 2: [5, 8]}
1 2 [1, 2, 3] 3 {1: [8], 2: [5], 3: [6]}
2 3 [1, 3] 2 {1: [2, 3, 9], 3: [10]}
Total_Modules
0 8
1 3
2 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句