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
解决方案
想法是首先为列创建嵌套字典,然后通过withTotal
聚合,最后通过and添加新列: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
推荐阅读
- ethereum - 以太坊 LES getProofsV2 总是返回 [](空节点)
- python - 使用 http.server 访问底层套接字
- brat - 在 Brat 中如何通过 UI 设置事件?
- python - 如何将单选按钮值附加到列表
- objective-c - 加速度计和陀螺仪多值 - DJI iOS UXSDKDemo
- javascript - 使用javascript获取html中的子节点和子子节点
- regex - 如何在 Nginx 中使用 mod_rewrite 进行多次查询
- java - JavaSE 的 `java.sql javax.sql` 和 JDBC 驱动程序之间有什么关系?
- postgresql - Postgres:返回记录-错误-查询没有结果数据的目的地
- ios - 为什么 Metal 没有 rgb8Unorm MTLPixelFormat?