[코드잇] DataFrame다루기

silver0·2022년 8월 30일
0

코드잇

목록 보기
5/8

인덱싱

데이터를 편하게 다루고 분석을 잘하기 위해서는
인덱싱을 자유자재로 할 수 있어야 한다.


DataFrame에서 인덱싱을 통해 값을 받아오기 위해서는 loc 메소드를 사용하면 된다.

df.loc[row, column]

한 column에 대한 인덱싱은 컬럼명만으로도 할 수 있다.

df[column]

DataFrame에서 여러 값의 데이터를 인덱싱하는 방법에는 두 가지 방식이 있다.

  • 리스트로 인덱싱하는 방법
    df[[column1, column2]]
  • loc로 인덱싱하는 방법
    df.loc[:,['SBS','JTBC']]

연속적인 데이터들의 원하는 값만 추출할 때는 슬라이싱을 활용한다.

df.loc[2012:2017]
df.loc[:, 'KBS':'SBS']
df.loc[2012:2017, 'KBS':'SBS']

DataFrame 조건으로 인덱싱

df.loc[df[조건]]
df.loc[(df[조건]) & (df[조건])] # AND
df.loc[(df[조건]) | (df[조건])] # OR

특정 컬럼의 조건을 만족하는 값만 추출

df.loc[조건, '컬럼명']

두 개의 컬럼에 대해서 비교하고 해당 값만 추출

df.loc[df['컬럼명1'] < df['컬럼명2'], ['컬럼명1', '컬럼명2']]

numpy에서 값을 받아오기 위해 값의 인덱스를 이용한 것처럼
pandas에서도 값의 인덱스를 이용하여 인덱싱이 가능함.

df.iloc[로우 인덱스, 컬럼 인덱스]

특정 데이터 값 변경은 인덱싱 해서 새로 값을 입력하면 된다.

df.loc[로우명, 컬럼명] = 값
df.iloc[로우 인덱스, 컬럼 인덱스] =

특정 row/column 삭제

df.drop(이름, axis=0, inplace=True)
# axis = 0 행 / 1 열
# inplace = True 기존데이터에서 변경 / False 유지

새로운 row 추가는 인덱싱 후 컬럼별 값들은 리스트로 전달

df.loc[로우명] = [1,2]

DataFrame 컬럼명 변경

df.rename(columns={'기존이름' : '변경할이름', ...})
df.rename(columns={'기존이름' : '변경할이름'}, inpalce=True)

inpalce=True로 지정하면 기존 데이터프레임에서 변경이 된다.


DataFrame 인덱스명 변경

df.index.name = '변경할 이름'

DataFrame 인덱스 변경

df.set_index('컬럼명')
df.set_index('컬럼명', inpalce=True)
  • 이때 기존 인덱스는 사라지므로 먼저 새로운 컬럼으로 저장해주면 된다.
    df['새로운 컬럼명'] = df.index

inpalce=True로 지정하면 기존 데이터프레임에서 변경이 된다.


큰 DataFrame 살펴보기

dataframe의 상위 데이터와 하위 데이터 확인

df.head()
df.tail()

dataframe의 크기 확인

df.shape

dataframe의 컬럼 확인

df.columns

dataframe의 각 컬럼 정보

df.info()

dataframe의 각 컬럼 통계 정보

df.describe()

dataframe의 로우 정렬

df.sort_values(by="기준컬럼")
df.sort_values(by="기준컬럼", ascending=False) # 내림차순
df.sort_values(by="기준컬럼", ascending=False, inplace=True) # 내림차순 # 기존 데이터에서 변경

큰 Series 살펴보기

시리즈 데이터에서 중복된 데이터 제거

df.unique()

시리즈 데이터에서 각 데이터별로 count개수

df.value_counts()

시리즈 데이터 요약 정보

df.describe()

예제. 수강신청 준비하기

2,000명의 코드잇 대학교 학생들이 수강신청을 했습니다.


수강신청에는 다음 3개의 조건이 있습니다.


1. “information technology” 과목은 심화과목이라 1학년은 수강할 수 없습니다.
2. “commerce” 과목은 기초과목이고 많은 학생들이 듣는 수업이라 4학년은 수강할 수 없습니다.
3. 수강생이 5명이 되지 않으면 강의는 폐강되어 수강할 수 없습니다.


기존 DataFrame에 “status”라는 이름의 column을 추가하고, 학생이 수강 가능한 상태이면 “allowed”, 수강 불가능한 상태이면 “not allowed”를 넣어주세요.

import pandas as pd

df = pd.read_csv('data/enrolment_1.csv')
df["status"] = "allowed"

# 조건 1
boolean1 = df["course name"] == "information technology"
boolean2 = df["year"] == 1
df.loc[boolean1 & boolean2, "status"] = "not allowed"

# 조건 2
boolean3= df["course name"] == "commerce"
boolean4= df["year"] == 4
df.loc[boolean3& boolean4, "status"] = "not allowed"

# 조건 3
allowed = df["status"] == "allowed"
course_counts = df.loc[allowed, "course name"].value_counts()
closed_courses = list(course_counts[course_counts < 5].index)
for course in closed_courses:
    df.loc[df["course name"] == course, "status"] = "not allowed"

# 정답 확인
df
  • 조건 1 : “information technology” 과목은 심화과목이라 1학년은 수강할 수 없습니다.

    • 과목명 “information technology” 에 해당하는 데이터를 boolean1에 저장
    • 학년이 "1" 인 데이터를 boolean2에 저장
    • 두 조건을 동시에 만족하는 데이터는 not allowed 값으로 변경
  • 조건 2 : “commerce” 과목은 기초과목이고 많은 학생들이 듣는 수업이라 4학년은 수강할 수 없습니다.

    • 과목명 "commerce" 에 해당하는 데이터를 boolean3에 저장
    • 학년이 "4" 인 데이터를 boolean4에 저장
    • 두 조건을 동시에 만족하는 데이터는 not allowed 값으로 변경
  • 조건 3 : 수강생이 5명이 되지 않으면 강의는 폐강되어 수강할 수 없습니다.

    • 조건 1과 조건 2에 해당하지 않는 allowed 상태인 데이터만 따로 저장
    • value_counts()를 사용하여 각 과목별 신청 인원 확인
    • 각 과목별 신청 인원이 5 이하인 과목의 index만 골라서 리스트로 생성
    • for문을 통해 폐강 과목에 해당하는 데이터에 not allowed 값으로 변경


예제, 강의실 배정하기

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


강의실은 규모에 따라 “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”가 되어야 합니다.

import pandas as pd

df = pd.read_csv('data/enrolment_2.csv')
df["room assignment"] = "not assigned"

# 코드를 작성하세요.
allowed = df["status"] == "allowed"
course_counts = df.loc[allowed, "course name"].value_counts()

# 1
auditorium = list(course_counts[course_counts >= 80].index)
for i in auditorium :
    df.loc[(df['course name'] == i) & allowed, "room assignment"] = "Auditorium"

# 2
large = list(course_counts[(course_counts >= 40) & (course_counts < 80)].index)
for i in large :
    df.loc[(df['course name'] == i) & allowed, "room assignment"] = "Large room"

# 3
medium = list(course_counts[(course_counts >= 15) & (course_counts < 40)].index)
for i in medium :
    df.loc[(df['course name'] == i) & allowed, "room assignment"] = "Medium room"

# 4
small = list(course_counts[(course_counts >= 5) & (course_counts < 15)].index)
for i in small :
    df.loc[(df['course name'] == i) & allowed, "room assignment"] = "Small room"

# 5 
not_allowed = df["status"] == "not allowed"
df.loc[not_allowed, "room assignment"] = "not assigned"

# 정답 출력
df
  • 먼저 status가 "allowed"인 과목의 수강 인원 가져오기
  • 강의실 규모별로 list 만든 후 for문을 통해 room assignment 값 지정
  • status가 "not allowed"인 과목에 대해서도 room assignment 값 지정


코드잇에서 무료 수강하며 학습한 내용을 정리한 글입니다.

profile
작은 일이라도 꾸준히 노력하면 큰 뜻을 이룰 수 있다

0개의 댓글

관련 채용 정보