소프트웨어융합/코드잇 정리.py
pandas - dataframe 예제1-2/강의실
류지나
2021. 7. 17. 19:43
수강 신청이 완료되었습니다. 이제 각 과목을 수강하는 학생수에 따라 크기가 다른 강의실을 배치하려고 합니다.
강의실은 규모에 따라 “Auditorium”, “Large room”, “Medium room”, “Small room” 총 4가지 종류가 있습니다.
아래 조건에 따라 강의실 종류를 지정해 주세요.
- 80명 이상의 학생이 수강하는 과목은 “Auditorium”에서 진행됩니다.
- 40명 이상, 80명 미만의 학생이 수강하는 과목은 “Large room”에서 진행됩니다.
- 15명 이상, 40명 미만의 학생이 수강하는 과목은 “Medium room”에서 진행됩니다.
- 5명 이상, 15명 미만의 학생이 수강하는 과목은 “Small room”에서 진행됩니다.
- 폐강 등의 이유로 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”에 따라 강의실 이름을 붙여주려고 합니다.
아래 세 가지 조건을 만족하도록 코드를 작성하세요.
- 같은 크기의 강의실이 필요한 과목에 대해 알파벳 순서대로 방 번호를 배정하세요. 예를 들어 Auditorium이 필요한 과목으로 “arts”, “commerce”, “science” 세 과목이 있다면, “arts”는 “Auditorium-1”, “commerce”는 “Auditorium-2”, “science”는 “Auditorium-3” 순서로 방 배정이 되어야 합니다.
- “status” column이 “not allowed”인 수강생은 “room assignment” column을 그대로 “not assigned”로 남겨둡니다.
- “room assignment” column의 이름을 “room number”로 바꿔주세요.
아래 세 가지 조건을 만족해야 합니다.
- 같은 크기의 강의실이 필요한 과목에 대해 알파벳 순서대로 방 번호를 배정하세요. 예를 들어 Auditorium이 필요한 과목으로 “arts”, “commerce”, “science” 세 과목이 있다면, “arts”는 “Auditorium-1”, “commerce”는 “Auditorium-2”, “science”는 “Auditorium-3” 순서로 방 배정이 되어야 합니다.
- “status”가 “not allowed”인 수강생은 “room assignment”를 그대로 “not assigned”로 남겨둡니다.
- “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에 대한 조건이 없기 때문에
잘 추가하셔야 할 것 같습니다.