왼쪽의 데이터 프레임과 오른쪽 데이터 프레임의 차이는 무엇인가?
"room assignment"라는 column이 새로 생성되었고 value들도 어떠한 조건에 따라서 다르게 삽입되어있다.
조건)
- 80명 이상의 학생이 수강하는 과목은 “Auditorium”에서 진행됩니다.
- 40명 이상, 80명 미만의 학생이 수강하는 과목은 “Large room”에서 진행됩니다.
- 15명 이상, 40명 미만의 학생이 수강하는 과목은 “Medium room”에서 진행됩니다.
- 5명 이상, 15명 미만의 학생이 수강하는 과목은 “Small room”에서 진행됩니다.
- 폐강 등의 이유로 status가 “not allowed”인 수강생은 room assignment 또한 “not assigned”가 되어야 합니다.
오답)
"course name" 중, status가 "allowed"인 row들만 뽑기 → "allowed"인 row들의 "course name" 리스트 뽑기 → for문에 집어 넣어서 value_count()로 if 조건문 걸기
1. status가 "allowed"인 것들만 뽑아서 delete_df에 할당
delete_df=enrolment_df.loc[enrolment_df['status']=='allowed']
2. "course name" 리스트 뽑기
delete_df1=delete_df['course name'].value_counts()
delete_list=list(delete_df1.index)
처음에는 왜 df.index가 course name의 값들만 추출해주는지 몰랐는데, 앞서 실행했던 value_count()의 결과값이
이런식으로 나와서 이 결과의 index는 course name들이니 index를 호출하는게 맞는 것이라고 이해했다.
3. 새로 만들 column에 어떤 값을 지정해줘야 새로 만들어져서 나중에 for문을 활용할 때도 문제가 없다는 것 기억하자.
enrolment_df["room assignment"] = "not assigned"
4. 이 진행방식으로 코드를 작성했더니 문제점이 발생했다. list에는 value_count()가 작동하지 않았다. 그러던 중 파이썬 while문을 배울 때 알게 된 len 함수가 DataFrame에도 적용된다는 걸 알게 됐다.
for course in delete_list:
count=len(delete_df.loc[delete_df['course name']==course])
if count>80:
enrolment_df.loc[delete_df['course name'] == course, "room assignment"] = 'Auditorium'
이런 식으로 위에 조건들을 쭉 작성했는데 IndexingError: 오류가 떴다. enrolment_df의 index 수와 delete_df의 index 수가 맞지 않았던 것이다. enrolment_df는 2000개의 index가 있었고, delete_df는 status가 "allowed"인 것들만 모아 놓은 것이라 1448개였다.
그래서 status가 "allowed"인 "course name"의 리스트를 뽑는 게 의미가 없다는 걸 알았다.
그냥 "not allowed"인 것들은 "not assigned"로 할당해주고, for문을 이용해 조건을 하나씩 걸어주면 "allowed"들도 필터링될 것이기 때문이다. 너무 꼬아서 생각하지 말기.
정답)
import pandas as pd
enrolment_df=pd.read_csv('data/enrolment_1.csv')
enrolment_df["room assignment"] = "not assigned"
for i in enrolment_df['course name'].unique():
count = len(enrolment_df.loc[enrolment_df['course name'] == i])
if count < 5:
enrolment_df.loc[enrolment_df['course name'] == i, "room assignment"] = 'not assigned'
elif count < 15:
enrolment_df.loc[enrolment_df['course name'] == i, "room assignment"] = 'Small room'
elif count < 40:
enrolment_df.loc[enrolment_df['course name'] == i, "room assignment"] = 'Medium room'
elif count < 80:
enrolment_df.loc[enrolment_df['course name'] == i, "room assignment"] = 'Large room'
else:
enrolment_df.loc[enrolment_df['course name'] == i, "room assignment"] = 'Auditorium'
'Programming > python' 카테고리의 다른 글
파이썬 python drop, rename, isin 함수로 데이터 정제하기 -1 (0) | 2021.07.19 |
---|---|
판다스 pandas IQR 활용해서 이상점(outlier) 찾고 삭제하기 (0) | 2021.07.12 |
판다스 axis 매개변수 개념 완벽정리 (0) | 2021.07.01 |
파이썬 python groupby 함수 이용해서 여성 비율이 높은 직업 알아보기 (0) | 2021.06.25 |
파이썬 python drop 함수 활용해서 행 삭제하기 (0) | 2021.06.07 |