본문 바로가기

IT/codeit

[Codeit] DataFrame 다루기 - 코드잇 대학교

1. 수강신청 준비하기

import pandas as pd

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

# 코드를 작성하세요.
# 기존 DataFrame에 “status”라는 이름의 column을 추가하고, 학생이 수강 가능한 상태이면 “allowed”, 수강 불가능한 상태이면 “not allowed”를 넣어주세요.
df.loc[:,'status'] = 'allowed'

#1번 조건 : “information technology” 과목은 심화과목이라 1학년은 수강할 수 없습니다.
df.loc[(df.loc[:,'year'] == 1) & (df.loc[:,'course name'] == 'information technology'), 'status'] = 'not allowed'

#2번 조건 : “commerce” 과목은 기초과목이고 많은 학생들이 듣는 수업이라 4학년은 수강할 수 없습니다.
df.loc[(df.loc[:,'year'] == 4) & (df.loc[:,'course name'] == 'commerce'), 'status'] = 'not allowed'

#3번 조건 : 수강생이 5명이 되지 않으면 강의는 폐강되어 수강할 수 없습니다.
df1 = df['course name'].value_counts() < 5
df2 = df1[df1]
df3 = list(df2.index)

for i in df3:
    df.loc[df['course name'] == i, 'status'] = 'not allowed'

# 정답 출력
df

 

조건 1,2번은 쉬웠는데 3번...

df에서 수강생이 5명이 되지 않는 과목명으로 df1을 만드는 것은 알겠는데, df1[df1]은 뭘까 싶어 searching . . .

 

"이 조건을 달아서 우리가 원하는 True인 값만 볼수 있는 Series를 만들어줌"

 

아하 !

그리고 그렇게 만든 Series인 df2에 index를 붙여서 리스트화해서 for문 돌ㄹㄹ리기

 

기억합시다 ^_^

 

 

2. 강의실 배정하기 I

import pandas as pd

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

# 여기에 코드를 작성하세요
df.loc[:,'room assignment'] = 'not assigned'

#80명 이상의 학생이 수강하는 과목은 “Auditorium”에서 진행됩니다.
df1 = df['course name'].value_counts() >= 80
df2 = df1[df1]
df3 = list(df2.index)

for i in df3:
    df.loc[df['course name'] == i, 'room assignment'] = 'Auditorium'

#40명 이상, 80명 미만의 학생이 수강하는 과목은 “Large room”에서 진행됩니다.
df1 = df['course name'].value_counts() >= 40
df11 = df['course name'].value_counts() < 80
df2 = df11[df11]
df3 = list(df2.index)

for i in df3:
    df.loc[df['course name'] == i, 'room assignment'] = 'Large room'
    
#15명 이상, 40명 미만의 학생이 수강하는 과목은 “Medium room”에서 진행됩니다.
df1 = df['course name'].value_counts() >= 15
df11 = df['course name'].value_counts() < 40
df2 = df11[df11]
df3 = list(df2.index)

for i in df3:
    df.loc[df['course name'] == i, 'room assignment'] = 'Medium room'

#5명 이상, 15명 미만의 학생이 수강하는 과목은 “Small room”에서 진행됩니다.
df1 = df['course name'].value_counts() >= 5
df11 = df['course name'].value_counts() < 15
df2 = df11[df11]
df3 = list(df2.index)

for i in df3:
    df.loc[df['course name'] == i, 'room assignment'] = 'Small room'
    
#폐강 등의 이유로 status가 “not allowed”인 수강생은 room assignment 또한 “not assigned”가 되어야 합니다.
df.loc[df['status'] == 'not allowed', 'room assignment'] = 'not assigned'

# 테스트 코드
df

아무리봐도 지저분해.. 해설보기 (아래 코드는 모범 답안)

 

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

df를 만들 때 조건을 고려하지 않고 list화할 때 조건을 고려하면 df를 4번씩 만들 필요가 없어지는군요

그럼 조건 여러개를 동시에 (&로) 고려할 수 있군요

그런데 각 list를 따로 만들지 않고 한 list에서 for문으로 조건1->지정1 을 4줄로 작성할 수는 없는건지..?

 

그건 index를 따오는 순간 수강신청인 수를 이용할 수 없게 되어서 어려울 것 같네요.

그래서 모범답안이 긴가봅니다.

 

 

3. 강의실 배정하기 II

import pandas as pd

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

# 여기에 코드를 작성하세요
#같은 크기의 강의실이 필요한 과목에 대해 알파벳 순서대로 방 번호를 배정하세요.

df1 = list(set(df.loc[df.loc[:,'room assignment'] == 'Auditorium', 'course name']))
df1.sort()
a = 1
for i in df1:
    df.loc[df['course name'] == i, 'room assignment'] = "Auditorium-" + str(a)
    a += 1

df1 = list(set(df.loc[df.loc[:,'room assignment'] == 'Large room', 'course name']))
df1.sort()
b = 1
for i in df1:
    df.loc[df['course name'] == i, 'room assignment'] = "Large-" + str(b)
    b += 1
    
df1 = list(set(df.loc[df.loc[:,'room assignment'] == 'Medium room', 'course name']))
df1.sort()
c = 1
for i in df1:
    df.loc[df['course name'] == i, 'room assignment'] = "Medium-" + str(c)
    c += 1
    
df1 = list(set(df.loc[df.loc[:,'room assignment'] == 'Small room', 'course name']))
df1.sort()
d = 1
for i in df1:
    df.loc[df['course name'] == i, 'room assignment'] = "Small-" + str(d)
    d += 1

#status column이 “not allowed”인 수강생은 room assignment column을 그대로 “not assigned”로 남겨둡니다.
df.loc[df['status'] == 'not allowed', 'room assignment'] = "not assigned"

#room assignment column의 이름을 room number로 바꿔주세요.
df.rename(columns={'room assignment':'room number'}, inplace=True)

# 테스트 코드
df

set은 집합이라 중복X, 근데 순서도X

list는 중복O, 순서O -> sort 함수 사용 가능

변수를 문자처럼 쓸 때 str(변수), 전역변수면 이전 명령에 의해 변한 값이 보존됨

rename 함수 사용 시 마지막에 inplace = True 써주기 !

'IT > codeit' 카테고리의 다른 글

[Codeit] DataFrame 다루기  (0) 2023.02.05