본문 바로가기
Programming/python

DataFrame과 for문 이용하여 큰 데이터 다루기

by 조창대 2021. 5. 27.
반응형

왼쪽의 데이터 프레임과 오른쪽 데이터 프레임의 차이는 무엇인가?

"room assignment"라는 column이 새로 생성되었고 value들도 어떠한 조건에 따라서 다르게 삽입되어있다. 

 

조건)

  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”가 되어야 합니다.

 

오답)

"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'
반응형