【发布时间】:2022-01-22 04:27:30
【问题描述】:
我正在创建一个虚拟数据集,用于测试大学的云存储和仪表板系统。我目前正在尝试为给定学期的每个学生 ID 分配课程。这将是现实生活中的课程注册步骤。大多数学生上满载,4节课,有些学生上3,2或1节课,概率递减。
我有两个 pandas DataFrame,“courses”和“students_master”。
“课程”有 1100 行,如下所示:
subject_id course_id SECTION_SUBJECT SECTION_SUBJECT_DESC \
0 HCH HCH-101 HPCH Community Health Promotion
1 HCH HCH-102 HPCH Community Health Promotion
2 HCH HCH-103 HPCH Community Health Promotion
3 HCH HCH-104 HPCH Community Health Promotion
4 HCH HCH-105 HPCH Community Health Promotion
'students_master' 有 27054 行,如下所示:
ID_year_id cohort ids level num_classes
0 22180 2013FA 1001269 4 4
1 49919 2013FA 1000206 4 4
2 48206 2013FA 1000524 4 2
3 40649 2013FA 1000233 4 3
4 29733 2013FA 1000533 4 2
此时我正在尝试创建一个新列,students_master['selections'],我在其中使用“num_classes”列中的数字 1-4 从课程 ['course_id] 中随机选择多个 course_id ']。生成的列值将是小列表,例如 [HCH-101, TWI-302,...]
当我使用这段代码时:
list(courses['course_id'].sample(4))
它起作用了,结果是:
['EVS-406', 'BFN-201', 'ATS-105', 'BOL-103']
我尝试过使用 .apply 以及基本的 for 循环,但没有成功。我认为最有前途的方法是“矢量化”。所以我写了这个 .select 语句:
selections=[]
conditions = [
(students_master['num_classes']==4),
(students_master['num_classes']==3),
(students_master['num_classes']==2),
(students_master['num_classes']==1)
]
choices = [
([list(courses['course_id'].sample(4))]),
([list(courses['course_id'].sample(3))]),
([list(courses['course_id'].sample(2))]),
([list(courses['course_id'].sample(1))])
]
selections.append(np.select(conditions, choices))
它得到错误:“形状不匹配:对象不能被广播到单个形状”
非常感谢任何有关如何解决此问题的建议。
【问题讨论】: