Преобразование DataFrame Pandas в несколько отдельных серий Pandas

Мой школьный округ попросил меня запланировать учащихся на факультативные занятия в следующем году в зависимости от их уровня обучения. К сожалению, у нас нет доступа к некоторым удобным приложениям для планирования, которые могут делать это автоматически. Вместо того чтобы вручную записывать каждого студента, я решил попробовать использовать Python. Раньше я писал код, чтобы ускорить некоторые задачи администрирования низкого уровня, но это оказалось гораздо сложнее, чем я ожидал.

Мой код должен сделать следующее:

  • Перебирать список учащихся и их уровень обучения.
  • Случайным образом назначьте каждого ученика в одну секцию одного класса на каждый из шести периодов.
  • Убедитесь, что учащиеся не занесены в список нескольких разделов одного класса (например, два раздела английского языка 1).
  • Убедитесь, что 2 из 6 занятий называются «Экективными».
  • Убедитесь, что в раздел класса назначено не более 30 учащихся.

Вот пример вывода, который я хотел бы увидеть:

Класс 1 Раздел 1 Класс 1 Раздел 2 Студент 1 Студент 3 Студент 2 Студент 4

Вот еще один формат, который может создать мой код:

Студенты 1-й период 2-й период Студент 1 Курс 1 Раздел 1 Курс 3 Раздел 2 Студент 2 Курс 2 Раздел 1 Курс 4 Раздел 1 Студент 3 Курс 3 Раздел 1 Курс 1 Раздел 2

У меня есть CSV из 500 учеников (имена заменены на «Студент X» по соображениям конфиденциальности) и соответствующий им уровень успеваемости. Я преобразовал этот CSV в DataFrame Pandas и написал следующий код. Я пошел в том направлении, чтобы превратить каждый курс (например, «Английский 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, потому что это происходит во время тот же период, что и Раздел 1 ELA.

Это заставляет меня думать, что мне следует организовать свою серию Pandas по разделам класса в каждом периоде (например, все классы 1-го класса для 9-го класса, все классы для 2-го класса для 9-го класса и т. д.), а не по разделам в каждом типе урока (например, все классы 9-го класса). курсы ELA, все курсы алгебры и т. д.).

Я ценю любую помощь или рекомендации, которые вы можете предложить.

это действительно интересный способ писать df_ela1 = pd.DataFrame(ela1)

folen gateis 05.06.2024 19:54
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что проще всего было бы иметь один фрейм данных, содержащий информацию обо всех учениках и всех занятиях, которые они будут посещать. Получив такой фрейм данных, вы сможете получить любую информацию о посещаемости курсов, например, какие студенты посещают «Курс 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]

Отлично! Я не думал превращать весь курс в столбец DataFrame. Ваш код также помог мне узнать больше о DataFrames в целом. Спасибо!

Gandr23 06.06.2024 15:48

Другие вопросы по теме