Groupby聚合并根据熊猫中的条件创建字典

时间:2020-03-01 14:04:08

标签: pandas pandas-groupby

我有如下所示的数据帧。该表说明了用户在每门课程中观看的模块。

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    

1 个答案:

答案 0 :(得分:2)

想法是首先为Total列创建嵌套字典,然后由GroupBy.aggSeriesGroupBy.uniqueSeriesGroupBy.nuniqueGroupBy.size进行汇总,最后由{ {3}}和DataFrame.insert

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