【问题标题】:Select number of values from column based on condition in a different df column根据不同 df 列中的条件从列中选择值的数量
【发布时间】: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))

它得到错误:“形状不匹配:对象不能被广播到单个形状”

非常感谢任何有关如何解决此问题的建议。

【问题讨论】:

    标签: pandas random


    【解决方案1】:

    这个,您可以使用apply 来确保课程不会在每个学生中重复:

    selection = student_master['num_classes'].apply(lambda x: np.random.choice(course['course_id'], x, replace=False) )
                                                
    

    【讨论】:

    • 谢谢,但这给出了错误:'cannot perform reduce with flexible type'
    • 啊哈!我的“num_classes”列不是 INT 类型,而是对象。我转换了它,现在一切正常。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多