将 Pandas DataFrame 转换为多个不同的 Pandas 系列

问题描述 投票:0回答:1

我的学区要求我根据学生的年级水平安排明年的非选修课程。不幸的是,我们无法使用一些可以自动执行此操作的简洁的日程安排应用程序。我想尝试使用 Python,而不是手动对每个学生进行排班。我之前编写过代码来加快一些低级管理任务的速度,但这比我预期的更具挑战性。

我的代码需要执行以下操作:

  • 迭代学生列表及其年级
  • 在我们的 6 个学期中,将每个学生随机分配到一个班级的一个部分
  • 确保学生不会被编入同一班级的多个部分(例如,英语 1 的两个部分)
  • 确保 6 门课程中的 2 门被称为“选修课”
  • 确保分配到一个班级的学生不超过 30 人

这是我想看到的输出示例:

1 类第 1 部分 第 1 类第 2 部分
学生1 学生3
学生2 学生4

这是我的代码可以生成的另一种格式:

学生们 第一期 第二期
学生1 课程 1 第 1 部分 课程 3 第 2 部分
学生2 课程 2 第 1 部分 课程 4 第 1 部分
学生3 课程 3 第 1 部分 课程 1 第 2 部分

我有一个包含 500 名学生的 CSV(出于保密原因,姓名替换为“学生 X”)及其相关年级。我已将此 CSV 转换为 Pandas DataFrame 并编写了以下代码。我的方向是将每门课程(例如英语 1、代数 1 等)制作成一个 Pandas 系列,并将其连接到一个更大的 DataFrame。对于这个例子,我将其限制为仅一种课程类型(英语 1,又名“ELA 1”)作为测试:

import pandas as pd

s_test = 'schedule_test.csv' # Roster of students and grade levels

df_s_test = pd.read_csv(s_test)

class_size_limit = 30

stop = 0

df_shuffle = df_s_test.sample(frac=1)

ela1 = {'ELA Section 1':[],'ELA Section 2':[],'ELA Section 3':[],'ELA Section 4':[],'ELA Section 5':[],'ELA Section 6':[]}

sections = ['Section 1','Section 2','Section 3','Section 4','Section 5','Section 6']

for s in df_shuffle.index:
    for sec in sections:
        if df_shuffle.loc[s,'Grade Level']=='9th':
            if stop==0:
                if df_shuffle.loc[s,'Student'] not in ela1[sec]:
                    if len(ela1[sec]) < class_size_limit:
                        ela1[sec]+=[df_shuffle.loc[s,'Student']]
                        stop+=1
    stop = 0

ela1 =pd.Series(ela1)

df_ela1 = pd.DataFrame({})

df_ela1 = pd.concat([df_ela1,ela1.to_frame().T],ignore_index=True)

df_ela1.to_csv('test.csv',index=False)

不幸的是,我生成的 DataFrame 由列表而不是学生的单个字符串组成:

ELA 第 1 部分 ELA 第 2 部分
[学生1,学生4...] [10号学生,152号学生……]

目前还没有办法阻止学生被编入与他们已经所在的部分冲突的部分。例如,我的代码必须防止学生 1 被放入代数 1 第 1 部分,因为它发生与 ELA 第 1 部分同一时期。

这让我觉得我应该按每个时期的班级部分(例如,所有 9 年级第 1 节课、所有 9 年级第 2 节课等)而不是每个班级类型的部分(例如,所有 ELA 课程、所有代数课程等)。

我感谢您提供的任何帮助或指导。

python python-3.x pandas dataframe series
1个回答
0
投票

我认为最简单的方法是拥有一个数据框架,其中包含所有学生及其将参加的所有课程的信息。一旦您有了这样的数据框架,您就可以获得有关课程参加情况的任何信息,例如哪些学生参加“课程 1,第 1 部分”或某个学生参加哪些课程。 最终数据框将如下所示:

Student Name  Grade   course 1   course 2   course 3
3     Student 4      9  Section 1  Section 1  Section 1
18   Student 19      9  Section 1  Section 1  Section 1
21   Student 22      9  Section 1  Section 1  Section 1
24   Student 25      9  Section 1  Section 1  Section 1
37   Student 38      9  Section 1  Section 1  Section 1
41   Student 42      9  Section 1  Section 1  Section 1
42   Student 43      9  Section 1  Section 1  Section 1
94   Student 95      9  Section 1  Section 1  Section 1

您可以从那里获取参加课程 1 的学生的信息第 1 部分:

  Student Name
3     Student 4
18   Student 19
21   Student 22
24   Student 25
37   Student 38
41   Student 42
42   Student 43
94   Student 95

代码

import pandas as pd
import random

#maximum number of grades
max_grade = 10
#create an example dataframe
students = pd.DataFrame({"Student Name": ["Student " + str(i+1) for i in range (100)], "Grade": [random.randint(1,
                                                                                                               max_grade) for
                                                                                                 i in range (100)]})
courses = ["course 1", "course 2", "course 3"]
sections = ['Section 1','Section 2','Section 3', "Section 4"]
grades = [i+1 for i in range(max_grade)]
class_size_limit = 30

#create columns with names of the courses and assign initial value "None"
for course in courses:
    students[course] = "None"
#randomly assign students of grade 9 to different courses and different sections
for course in courses:
    for sec in sections:
        not_assigned_students = students[(students["Grade"] == 9) & (students[course] == "None")]
        if class_size_limit < not_assigned_students.shape[0]:
            sample_indexes = not_assigned_students.sample(n=class_size_limit).index
            students.loc[sample_indexes, course] = sec
        else:
            sample_indexes = not_assigned_students.index
            students.loc[sample_indexes, course] = sec

#get students assigned to the "Course1, Section 1"
students[students["course 1"]=="Section 1"][["Student Name"]]
#get number of students assigned to the "Course1, Section 1"
students[students["course 1"]=="Section 1"]["Student Name"].shape[0]

© www.soinside.com 2019 - 2024. All rights reserved.