소프트웨어융합/코드잇 정리.py

pandas - dataframe 예제1-2/강의실

류지나 2021. 7. 17. 19:43

수강 신청이 완료되었습니다. 이제 각 과목을 수강하는 학생수에 따라 크기가 다른 강의실을 배치하려고 합니다.

강의실은 규모에 따라 “Auditorium”, “Large room”, “Medium room”, “Small room” 총 4가지 종류가 있습니다.

아래 조건에 따라 강의실 종류를 지정해 주세요.

  1. 80명 이상의 학생이 수강하는 과목은 “Auditorium”에서 진행됩니다.
  2. 40명 이상, 80명 미만의 학생이 수강하는 과목은 “Large room”에서 진행됩니다.
  3. 15명 이상, 40명 미만의 학생이 수강하는 과목은 “Medium room”에서 진행됩니다.
  4. 5명 이상, 15명 미만의 학생이 수강하는 과목은 “Small room”에서 진행됩니다.
  5. 폐강 등의 이유로 status가 “not allowed”인 수강생은 room assignment 또한 “not assigned”가 되어야 합니다.

주의: 자동 채점 과제입니다. 정답 출력 코드는 print 없이 작성해 주세요. (예시: df)

답1

import pandas as pd

df = pd.read_csv('data/enrolment_2.csv')

# 과목별 인원 가져오기
allowed = df["status"] == "allowed"
course_counts = df.loc[allowed, "course name"].value_counts()

# 각 강의실 규모에 해당되는 과목 리스트 만들기
auditorium_list = list(course_counts[course_counts >= 80].index)
large_room_list = list(course_counts[(80 > course_counts) & (course_counts >= 40)].index)
medium_room_list = list(course_counts[(40 > course_counts) & (course_counts >= 15)].index)
small_room_list = list(course_counts[(15 > course_counts) & (course_counts > 4)].index)

# not allowed 과목에 대해 값 지정해주기
not_allowed = df["status"] == "not allowed"
df.loc[not_allowed, "room assignment"] = "not assigned"

# allowed 과목에 대해 값 지정해주기
for course in auditorium_list:
    df.loc[(df["course name"] == course) & allowed, "room assignment"] = "Auditorium"
for course in large_room_list:
    df.loc[(df["course name"] == course) & allowed, "room assignment"] = "Large room"
for course in medium_room_list:
    df.loc[(df["course name"] == course) & allowed, "room assignment"] = "Medium room"
for course in small_room_list:
    df.loc[(df["course name"] == course) & allowed, "room assignment"] = "Small room"
    
# 정답 출력
df

답2

import pandas as pd
import numpy as np

df = pd.read_csv("data/enrollment_2.csv")
studentnumlist = df['course name'].value_counts()

auditoriumclasslist = list(studentnumlist[studentnumlist > 80].index)
mediumroomclasslist = list(studentnumlist[(studentnumlist <= 80) & (studentnumlist > 40)].index)
largeroomclasslist = list(studentnumlist[(studentnumlist <= 40) & (studentnumlist > 15)].index)

notassignedboolseries = df['status'] == 'not allowed'
auditoriumboolseries = df['course name'].isin(auditoriumclasslist)
largeroomboolseries = df['course name'].isin(largeroomclasslist)
mediumroomboolseries = df['course name'].isin(mediumroomclasslist)

df['room assignment'] = np.where(notassignedboolseries, 'not allowed', np.where(auditoriumboolseries, "Auditorium", np.where(largeroomboolseries, "Large room", np.where(mediumroomboolseries, "Medirum room", "Small room"))))
df

답3

import pandas as pd
df = pd.read_csv('data/enrolment_2.csv')
for i in df['course name'].unique():
    count = len(df.loc[df['course name'] == i])
    if count < 5:
        df.loc[df['course name'] == i, "room assignment"] = 'not assigned'
    elif count < 15:
        df.loc[df['course name'] == i, "room assignment"] = 'Small room'
    elif count < 40:
        df.loc[df['course name'] == i, "room assignment"] = 'Medium room'
    elif count < 80:
        df.loc[df['course name'] == i, "room assignment"] = 'Large room'
    else:
        df.loc[df['course name'] == i, "room assignment"] = 'Auditorium'
df.loc[df['status'] == 'not allowed', "room assignment"] = 'not assigned'
df

 

 

이전 과제에서 강의실 크기에 따라 “room assignment” column을 만들어 주었습니다.

이제 이 “room assignment”에 따라 강의실 이름을 붙여주려고 합니다.

아래 세 가지 조건을 만족하도록 코드를 작성하세요.

  1. 같은 크기의 강의실이 필요한 과목에 대해 알파벳 순서대로 방 번호를 배정하세요. 예를 들어 Auditorium이 필요한 과목으로 “arts”, “commerce”, “science” 세 과목이 있다면, “arts”는 “Auditorium-1”, “commerce”는 “Auditorium-2”, “science”는 “Auditorium-3” 순서로 방 배정이 되어야 합니다.
  2. “status” column이 “not allowed”인 수강생은 “room assignment” column을 그대로 “not assigned”로 남겨둡니다.
  3. “room assignment” column의 이름을 “room number”로 바꿔주세요.

아래 세 가지 조건을 만족해야 합니다.

  1. 같은 크기의 강의실이 필요한 과목에 대해 알파벳 순서대로 방 번호를 배정하세요. 예를 들어 Auditorium이 필요한 과목으로 “arts”, “commerce”, “science” 세 과목이 있다면, “arts”는 “Auditorium-1”, “commerce”는 “Auditorium-2”, “science”는 “Auditorium-3” 순서로 방 배정이 되어야 합니다.
  2. “status”가 “not allowed”인 수강생은 “room assignment”를 그대로 “not assigned”로 남겨둡니다.
  3. “room assignment” column의 이름을 “room number”로 바꿔주세요.

먼저, 앞선 과제와 같이 status가 allowed인 수강생들의 과목별 수강 인원을 받아옵니다. 그리고 이를 통해 각 강의실 규모에 해당되는 과목 리스트를 만들어 줍니다. 이렇게 만들어진 리스트를 활용해서, 각 강의실의 이름을 붙여줍니다. 마지막으로 column 이름을 바꿔줍니다.

import pandas as pd

df = pd.read_csv('data/enrolment_3.csv')

# 과목별 인원 가져오기
allowed = df["status"] == "allowed"
course_counts = df.loc[allowed, "course name"].value_counts()

# 각 강의실 규모에 해당되는 과목 리스트 만들기
auditorium_list = list(course_counts[course_counts >= 80].index)
large_room_list = list(course_counts[(80 > course_counts) & (course_counts >= 40)].index)
medium_room_list = list(course_counts[(40 > course_counts) & (course_counts >= 15)].index)
small_room_list = list(course_counts[(15 > course_counts) & (course_counts > 4)].index)

# 강의실 이름 붙이기
for i in range(len(auditorium_list)):
    df.loc[(df["course name"] == sorted(auditorium_list)[i]) & allowed, "room assignment"] = "Auditorium-" + str(i + 1)

for i in range(len(large_room_list)):
    df.loc[(df["course name"] == sorted(large_room_list)[i]) & allowed, "room assignment"] = "Large-" + str(i + 1)
    
for i in range(len(medium_room_list)):
    df.loc[(df["course name"] == sorted(medium_room_list)[i]) & allowed, "room assignment"] = "Medium-" + str(i + 1)
    
for i in range(len(small_room_list)):
    df.loc[(df["course name"] == sorted(small_room_list)[i]) & allowed, "room assignment"] = "Small-" + str(i + 1)

# column 이름 바꾸기
df.rename(columns={"room assignment": "room number"}, inplace = True)
    
# 정답 출력

 

 

질문

df[col_name] = df[col_name].apply(lambda x: foo(x))

를 하시면 foo가 col_name컬럼에 적용됩니다. 위 코드에 적용하면

result[idx]['room assignment'] = result[idx]['room assignment'].apply(lambda x: x + '-' + p)

이와 비슷한 코드를 쓰시면 될 것 같습니다.

이 코드를 실행할 경우 result[idx] 데이터프레임에 숫자가 잘 추가되는것은 확인했으나
로직에 문제가 몇가지 있는 것 같고 (idx는 항상 1입니다) 아직 i에 대한 조건이 없기 때문에 
잘 추가하셔야 할 것 같습니다.