[Python] Pandas정리(데이터 분석 라이브러리)

Pandas

파이썬에서 사용하는 데이터 분석 라이브러리

import pandas as pd

1. Series

1차원 데이터 (정수, 실수, 문자열 등)

Series 객체 생성

예) 1월부터 4월까지 평균 온도 데이터 (-20, -10, 10, 20)

temp = pd.Series([-20, -10, 10, 20])
temp
0   -20
1   -10
2    10
3    20
dtype: int64
temp[0] # 1월 온도
-20
temp[2] # 3월 온도
10

Series 객체 생성 (Index 지정)

temp = pd.Series([-20, -10, 10, 20], index=['Jan', 'Feb', 'Mar', 'Apr'])
temp
Jan   -20
Feb   -10
Mar    10
Apr    20
dtype: int64
temp['Jan'] # Index Jan (1월) 에 해당하는 데이터 출력
-20
temp['Apr'] # Index Apr (4월) 에 해당하는 데이터 출력
20
# temp['Jun'] # 존재하지 않는 Index 접근 시도 시 에러

2. DataFrame

2차원 데이터 (Series 들의 모음)

Data 준비

사전 (dict) 자료구조를 통해 생성

예) 슬램덩크 주요 인물 8명에 대한 데이터

data = {
    '이름' : ['채치수', '정대만', '송태섭', '서태웅', '강백호', '변덕규', '황태산', '윤대협'],
    '학교' : ['북산고', '북산고', '북산고', '북산고', '북산고', '능남고', '능남고', '능남고'],
    '키' : [197, 184, 168, 187, 188, 202, 188, 190],
    '국어' : [90, 40, 80, 40, 15, 80, 55, 100],
    '영어' : [85, 35, 75, 60, 20, 100, 65, 85],
    '수학' : [100, 50, 70, 70, 10, 95, 45, 90],
    '과학' : [95, 55, 80, 75, 35, 85, 40, 95],
    '사회' : [85, 25, 75, 80, 10, 80, 35, 95],
    'SW특기' : ['Python', 'Java', 'Javascript', '', '', 'C', 'PYTHON', 'C#']
}
data
{'이름': ['채치수', '정대만', '송태섭', '서태웅', '강백호', '변덕규', '황태산', '윤대협'],
 '학교': ['북산고', '북산고', '북산고', '북산고', '북산고', '능남고', '능남고', '능남고'],
 '키': [197, 184, 168, 187, 188, 202, 188, 190],
 '국어': [90, 40, 80, 40, 15, 80, 55, 100],
 '영어': [85, 35, 75, 60, 20, 100, 65, 85],
 '수학': [100, 50, 70, 70, 10, 95, 45, 90],
 '과학': [95, 55, 80, 75, 35, 85, 40, 95],
 '사회': [85, 25, 75, 80, 10, 80, 35, 95],
 'SW특기': ['Python', 'Java', 'Javascript', '', '', 'C', 'PYTHON', 'C#']}
data['이름']
['채치수', '정대만', '송태섭', '서태웅', '강백호', '변덕규', '황태산', '윤대협']
data['키']
[197, 184, 168, 187, 188, 202, 188, 190]

DataFrame 객체 생성

import pandas as pd
df = pd.DataFrame(data)
df
이름 학교 국어 영어 수학 과학 사회 SW특기
0 채치수 북산고 197 90 85 100 95 85 Python
1 정대만 북산고 184 40 35 50 55 25 Java
2 송태섭 북산고 168 80 75 70 80 75 Javascript
3 서태웅 북산고 187 40 60 70 75 80
4 강백호 북산고 188 15 20 10 35 10
5 변덕규 능남고 202 80 100 95 85 80 C
6 황태산 능남고 188 55 65 45 40 35 PYTHON
7 윤대협 능남고 190 100 85 90 95 95 C#

데이터 접근

df['이름']
0    채치수
1    정대만
2    송태섭
3    서태웅
4    강백호
5    변덕규
6    황태산
7    윤대협
Name: 이름, dtype: object
df['키']
0    197
1    184
2    168
3    187
4    188
5    202
6    188
7    190
Name: 키, dtype: int64
df[['이름', '키']] # 대괄호 하나 더 사용해야 2개이상(컬럼) 가져올 수 있음
이름
0 채치수 197
1 정대만 184
2 송태섭 168
3 서태웅 187
4 강백호 188
5 변덕규 202
6 황태산 188
7 윤대협 190

DataFrame 객체 생성 (Index 지정)

df = pd.DataFrame(data, index=['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번'])
df
이름 학교 국어 영어 수학 과학 사회 SW특기
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80
5번 강백호 북산고 188 15 20 10 35 10
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

DataFrame 객체 생성 (Column 지정)

data 중에서 원하는 column 만 선택하거나(1), 순서 변경 가능(2)

df = pd.DataFrame(data, columns=['이름', '학교', '키'])
df
이름 학교
0 채치수 북산고 197
1 정대만 북산고 184
2 송태섭 북산고 168
3 서태웅 북산고 187
4 강백호 북산고 188
5 변덕규 능남고 202
6 황태산 능남고 188
7 윤대협 능남고 190
df = pd.DataFrame(data, columns=['이름', '키', '학교'])
df
이름 학교
0 채치수 197 북산고
1 정대만 184 북산고
2 송태섭 168 북산고
3 서태웅 187 북산고
4 강백호 188 북산고
5 변덕규 202 능남고
6 황태산 188 능남고
7 윤대협 190 능남고

3. Index

데이터에 접근할 수 있는 주소 값

import pandas as pd
data = {
    '이름' : ['채치수', '정대만', '송태섭', '서태웅', '강백호', '변덕규', '황태산', '윤대협'],
    '학교' : ['북산고', '북산고', '북산고', '북산고', '북산고', '능남고', '능남고', '능남고'],
    '키' : [197, 184, 168, 187, 188, 202, 188, 190],
    '국어' : [90, 40, 80, 40, 15, 80, 55, 100],
    '영어' : [85, 35, 75, 60, 20, 100, 65, 85],
    '수학' : [100, 50, 70, 70, 10, 95, 45, 90],
    '과학' : [95, 55, 80, 75, 35, 85, 40, 95],
    '사회' : [85, 25, 75, 80, 10, 80, 35, 95],
    'SW특기' : ['Python', 'Java', 'Javascript', '', '', 'C', 'PYTHON', 'C#']
}
df = pd.DataFrame(data, index=['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번'])
df
이름 학교 국어 영어 수학 과학 사회 SW특기
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80
5번 강백호 북산고 188 15 20 10 35 10
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.index
Index(['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번'], dtype='object')

Index 이름 설정

df.index.name = '지원번호'
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80
5번 강백호 북산고 188 15 20 10 35 10
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

Index 초기화

기존 Index를 놔두고 새로운 Index를 만듬

df.reset_index()
지원번호 이름 학교 국어 영어 수학 과학 사회 SW특기
0 1번 채치수 북산고 197 90 85 100 95 85 Python
1 2번 정대만 북산고 184 40 35 50 55 25 Java
2 3번 송태섭 북산고 168 80 75 70 80 75 Javascript
3 4번 서태웅 북산고 187 40 60 70 75 80
4 5번 강백호 북산고 188 15 20 10 35 10
5 6번 변덕규 능남고 202 80 100 95 85 80 C
6 7번 황태산 능남고 188 55 65 45 40 35 PYTHON
7 8번 윤대협 능남고 190 100 85 90 95 95 C#

기존 Index를 없애고 새로운 Index를 만듬

df.reset_index(drop=True) # 원래 쓰던 '지원번호' 인덱스 삭제
이름 학교 국어 영어 수학 과학 사회 SW특기
0 채치수 북산고 197 90 85 100 95 85 Python
1 정대만 북산고 184 40 35 50 55 25 Java
2 송태섭 북산고 168 80 75 70 80 75 Javascript
3 서태웅 북산고 187 40 60 70 75 80
4 강백호 북산고 188 15 20 10 35 10
5 변덕규 능남고 202 80 100 95 85 80 C
6 황태산 능남고 188 55 65 45 40 35 PYTHON
7 윤대협 능남고 190 100 85 90 95 95 C#
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80
5번 강백호 북산고 188 15 20 10 35 10
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.reset_index(drop=True, inplace=True) #  inplace속성 활용해 실제 데이터에 바로 반영
# df = df.reset_index() 이런식으로 다시 변수 재정의해서 데이터 바로 반영도 가능
df
이름 학교 국어 영어 수학 과학 사회 SW특기
0 채치수 북산고 197 90 85 100 95 85 Python
1 정대만 북산고 184 40 35 50 55 25 Java
2 송태섭 북산고 168 80 75 70 80 75 Javascript
3 서태웅 북산고 187 40 60 70 75 80
4 강백호 북산고 188 15 20 10 35 10
5 변덕규 능남고 202 80 100 95 85 80 C
6 황태산 능남고 188 55 65 45 40 35 PYTHON
7 윤대협 능남고 190 100 85 90 95 95 C#

Index 설정

지정한 column 으로 Index 를 설정

df.set_index('이름')
학교 국어 영어 수학 과학 사회 SW특기
이름
채치수 북산고 197 90 85 100 95 85 Python
정대만 북산고 184 40 35 50 55 25 Java
송태섭 북산고 168 80 75 70 80 75 Javascript
서태웅 북산고 187 40 60 70 75 80
강백호 북산고 188 15 20 10 35 10
변덕규 능남고 202 80 100 95 85 80 C
황태산 능남고 188 55 65 45 40 35 PYTHON
윤대협 능남고 190 100 85 90 95 95 C#
df
이름 학교 국어 영어 수학 과학 사회 SW특기
0 채치수 북산고 197 90 85 100 95 85 Python
1 정대만 북산고 184 40 35 50 55 25 Java
2 송태섭 북산고 168 80 75 70 80 75 Javascript
3 서태웅 북산고 187 40 60 70 75 80
4 강백호 북산고 188 15 20 10 35 10
5 변덕규 능남고 202 80 100 95 85 80 C
6 황태산 능남고 188 55 65 45 40 35 PYTHON
7 윤대협 능남고 190 100 85 90 95 95 C#
df.set_index('이름', inplace=True) # inplace속성 활용한 예시(이제 그만 설명하겠음)
df
학교 국어 영어 수학 과학 사회 SW특기
이름
채치수 북산고 197 90 85 100 95 85 Python
정대만 북산고 184 40 35 50 55 25 Java
송태섭 북산고 168 80 75 70 80 75 Javascript
서태웅 북산고 187 40 60 70 75 80
강백호 북산고 188 15 20 10 35 10
변덕규 능남고 202 80 100 95 85 80 C
황태산 능남고 188 55 65 45 40 35 PYTHON
윤대협 능남고 190 100 85 90 95 95 C#

Index 정렬

Index 를 기준으로 오름차순, 내림차순 정렬

df.sort_index() # 인덱스로 오름차순 정렬
학교 국어 영어 수학 과학 사회 SW특기
이름
강백호 북산고 188 15 20 10 35 10
변덕규 능남고 202 80 100 95 85 80 C
서태웅 북산고 187 40 60 70 75 80
송태섭 북산고 168 80 75 70 80 75 Javascript
윤대협 능남고 190 100 85 90 95 95 C#
정대만 북산고 184 40 35 50 55 25 Java
채치수 북산고 197 90 85 100 95 85 Python
황태산 능남고 188 55 65 45 40 35 PYTHON
df.sort_index(ascending=False) # 내림차순으로 정렬
학교 국어 영어 수학 과학 사회 SW특기
이름
황태산 능남고 188 55 65 45 40 35 PYTHON
채치수 북산고 197 90 85 100 95 85 Python
정대만 북산고 184 40 35 50 55 25 Java
윤대협 능남고 190 100 85 90 95 95 C#
송태섭 북산고 168 80 75 70 80 75 Javascript
서태웅 북산고 187 40 60 70 75 80
변덕규 능남고 202 80 100 95 85 80 C
강백호 북산고 188 15 20 10 35 10

4. 파일 저장 및 열기

DataFrame 객체를 excel, csv, txt 등 형태의 파일로 저장 및 열기

import pandas as pd
data = {
    '이름' : ['채치수', '정대만', '송태섭', '서태웅', '강백호', '변덕규', '황태산', '윤대협'],
    '학교' : ['북산고', '북산고', '북산고', '북산고', '북산고', '능남고', '능남고', '능남고'],
    '키' : [197, 184, 168, 187, 188, 202, 188, 190],
    '국어' : [90, 40, 80, 40, 15, 80, 55, 100],
    '영어' : [85, 35, 75, 60, 20, 100, 65, 85],
    '수학' : [100, 50, 70, 70, 10, 95, 45, 90],
    '과학' : [95, 55, 80, 75, 35, 85, 40, 95],
    '사회' : [85, 25, 75, 80, 10, 80, 35, 95],
    'SW특기' : ['Python', 'Java', 'Javascript', '', '', 'C', 'PYTHON', 'C#']
}
df = pd.DataFrame(data, index=['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번'])
df.index.name = '지원번호'
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80
5번 강백호 북산고 188 15 20 10 35 10
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

저장하기

csv 파일로 저장

df.to_csv('score.csv', encoding='utf-8-sig')
df.to_csv('score.csv', encoding='utf-8-sig', index=False) # index정보 제외해서 저장

텍스트(.txt) 파일로 저장

df.to_csv('score.txt', sep='\t') # tab 으로 구분된 텍스트 파일

엑셀 파일로 저장

df.to_excel('score.xlsx')

열기

csv 파일 열기

df = pd.read_csv('score.csv')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
0 채치수 북산고 197 90 85 100 95 85 Python
1 정대만 북산고 184 40 35 50 55 25 Java
2 송태섭 북산고 168 80 75 70 80 75 Javascript
3 서태웅 북산고 187 40 60 70 75 80 NaN
4 강백호 북산고 188 15 20 10 35 10 NaN
5 변덕규 능남고 202 80 100 95 85 80 C
6 황태산 능남고 188 55 65 45 40 35 PYTHON
7 윤대협 능남고 190 100 85 90 95 95 C#
df = pd.read_csv('score.csv', skiprows=1) # 지정된 갯수 만큼의 row 를 건너뜀
df
채치수 북산고 197 90 85 100 95 85.1 Python
0 정대만 북산고 184 40 35 50 55 25 Java
1 송태섭 북산고 168 80 75 70 80 75 Javascript
2 서태웅 북산고 187 40 60 70 75 80 NaN
3 강백호 북산고 188 15 20 10 35 10 NaN
4 변덕규 능남고 202 80 100 95 85 80 C
5 황태산 능남고 188 55 65 45 40 35 PYTHON
6 윤대협 능남고 190 100 85 90 95 95 C#
df = pd.read_csv('score.csv', skiprows=[1, 3, 5]) # 1, 3, 5 row 는 제외 (row 0부터 시작)
df
이름 학교 국어 영어 수학 과학 사회 SW특기
0 정대만 북산고 184 40 35 50 55 25 Java
1 서태웅 북산고 187 40 60 70 75 80 NaN
2 변덕규 능남고 202 80 100 95 85 80 C
3 황태산 능남고 188 55 65 45 40 35 PYTHON
4 윤대협 능남고 190 100 85 90 95 95 C#
df = pd.read_csv('score.csv', nrows=4) # 지정된 갯수 만큼의 row 만 가져옴
df
이름 학교 국어 영어 수학 과학 사회 SW특기
0 채치수 북산고 197 90 85 100 95 85 Python
1 정대만 북산고 184 40 35 50 55 25 Java
2 송태섭 북산고 168 80 75 70 80 75 Javascript
3 서태웅 북산고 187 40 60 70 75 80 NaN
df = pd.read_csv('score.csv', skiprows=2, nrows=4) # 처음 2 row 무시, 이후에 4 row 를 가져옴
df
정대만 북산고 184 40 35 50 55 25 Java
0 송태섭 북산고 168 80 75 70 80 75 Javascript
1 서태웅 북산고 187 40 60 70 75 80 NaN
2 강백호 북산고 188 15 20 10 35 10 NaN
3 변덕규 능남고 202 80 100 95 85 80 C

텍스트(.txt) 파일 열기

df = pd.read_csv('score.txt', sep='\t') # '\t'를 구분자로해서 데이터를 가져온다
df
지원번호 이름 학교 국어 영어 수학 과학 사회 SW특기
0 1번 채치수 북산고 197 90 85 100 95 85 Python
1 2번 정대만 북산고 184 40 35 50 55 25 Java
2 3번 송태섭 북산고 168 80 75 70 80 75 Javascript
3 4번 서태웅 북산고 187 40 60 70 75 80 NaN
4 5번 강백호 북산고 188 15 20 10 35 10 NaN
5 6번 변덕규 능남고 202 80 100 95 85 80 C
6 7번 황태산 능남고 188 55 65 45 40 35 PYTHON
7 8번 윤대협 능남고 190 100 85 90 95 95 C#
df = pd.read_csv('score.txt', sep='\t', index_col='지원번호') # 불러오면서 바로 수정 방식
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df = pd.read_csv('score.txt', sep='\t')
df.set_index('지원번호', inplace=True) # 불러오고 나서 수정하는 방식
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

엑셀 파일 열기

df = pd.read_excel('score.xlsx')
df
지원번호 이름 학교 국어 영어 수학 과학 사회 SW특기
0 1번 채치수 북산고 197 90 85 100 95 85 Python
1 2번 정대만 북산고 184 40 35 50 55 25 Java
2 3번 송태섭 북산고 168 80 75 70 80 75 Javascript
3 4번 서태웅 북산고 187 40 60 70 75 80 NaN
4 5번 강백호 북산고 188 15 20 10 35 10 NaN
5 6번 변덕규 능남고 202 80 100 95 85 80 C
6 7번 황태산 능남고 188 55 65 45 40 35 PYTHON
7 8번 윤대협 능남고 190 100 85 90 95 95 C#
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

5. 데이터 확인

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

DataFrame 확인

계산 가능한 데이터에 대해 Column 별로 데이터의 갯수, 평균, 표준편차, 최소/최대값 등의 정보를 보여줌

df.describe() # 계산 가능한 데이터들 자동 계산후 보여주는 유용한 메소드
국어 영어 수학 과학 사회
count 8.000000 8.000000 8.000000 8.000000 8.000000 8.000000
mean 188.000000 62.500000 65.625000 66.250000 70.000000 60.625000
std 9.985704 29.519969 26.917533 30.325614 23.754699 32.120032
min 168.000000 15.000000 20.000000 10.000000 35.000000 10.000000
25% 186.250000 40.000000 53.750000 48.750000 51.250000 32.500000
50% 188.000000 67.500000 70.000000 70.000000 77.500000 77.500000
75% 191.750000 82.500000 85.000000 91.250000 87.500000 81.250000
max 202.000000 100.000000 100.000000 100.000000 95.000000 95.000000
df.info() # 각 컬럼에 대해 어떤 데이터 타입인지, 개수 등등 또 정보 알려줌
<class 'pandas.core.frame.DataFrame'>
Index: 8 entries, 1번 to 8번
Data columns (total 9 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   이름      8 non-null      object
 1   학교      8 non-null      object
 2   키       8 non-null      int64 
 3   국어      8 non-null      int64 
 4   영어      8 non-null      int64 
 5   수학      8 non-null      int64 
 6   과학      8 non-null      int64 
 7   사회      8 non-null      int64 
 8   SW특기    6 non-null      object
dtypes: int64(6), object(3)
memory usage: 640.0+ bytes
df.head() # 처음 5개의 row 를 가져옴(기본값 : 5)
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
df.head(7) # 처음 7개의 row 를 가져옴
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
df.tail() # 마지막 5개 row 를 가져옴
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.tail(3) # 마지막 3개 row 를 가져옴
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.values # 2차원 배열형태로 어떤 값을 가지는지 보여줌
array([['채치수', '북산고', 197, 90, 85, 100, 95, 85, 'Python'],
       ['정대만', '북산고', 184, 40, 35, 50, 55, 25, 'Java'],
       ['송태섭', '북산고', 168, 80, 75, 70, 80, 75, 'Javascript'],
       ['서태웅', '북산고', 187, 40, 60, 70, 75, 80, nan],
       ['강백호', '북산고', 188, 15, 20, 10, 35, 10, nan],
       ['변덕규', '능남고', 202, 80, 100, 95, 85, 80, 'C'],
       ['황태산', '능남고', 188, 55, 65, 45, 40, 35, 'PYTHON'],
       ['윤대협', '능남고', 190, 100, 85, 90, 95, 95, 'C#']], dtype=object)
df.index # 인덱스 정보를 보여줌
Index(['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번'], dtype='object', name='지원번호')
df.columns # 컬럼 정보를 보여줌
Index(['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회', 'SW특기'], dtype='object')
df.shape # row, column (8x9)
(8, 9)
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

Series 확인

df['키'].describe() # 키 컬럼의 데이터에 대해서 정보
count      8.000000
mean     188.000000
std        9.985704
min      168.000000
25%      186.250000
50%      188.000000
75%      191.750000
max      202.000000
Name: 키, dtype: float64
df['키'].min()
168
df['키'].max()
202
df['키'].nlargest(3) # 키 큰 사람 순서대로 3명 데이터
지원번호
6번    202
1번    197
8번    190
Name: 키, dtype: int64
df['키'].mean() # 평균
188.0
df['키'].sum()
1504
df['SW특기'].count() # 개수 추출(유효한 즉, 존재한 데이터만)
6
df['학교'].unique() # 중복을 제외한 유니크 값들 정보 추출
array(['북산고', '능남고'], dtype=object)
df['학교'].nunique() # 유니크 값들이 몇개인지 추출
2

6. 데이터 선택 (기본)

여기부터 많이 사용하게 될 것이다.

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

Column 선택 (label)

df['이름']
지원번호
1번    채치수
2번    정대만
3번    송태섭
4번    서태웅
5번    강백호
6번    변덕규
7번    황태산
8번    윤대협
Name: 이름, dtype: object
df['키']
지원번호
1번    197
2번    184
3번    168
4번    187
5번    188
6번    202
7번    188
8번    190
Name: 키, dtype: int64
df[['이름', '키']] # 다시 설명하자면, 복수 컬럼 데이터 접근은 괄호 한번더
이름
지원번호
1번 채치수 197
2번 정대만 184
3번 송태섭 168
4번 서태웅 187
5번 강백호 188
6번 변덕규 202
7번 황태산 188
8번 윤대협 190

Column 선택 (정수 index)

df.columns
Index(['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회', 'SW특기'], dtype='object')
df.columns[0]
'이름'
df.columns[2]
'키'
df[df.columns[0]] # df['이름'] 과 동일한 동작
지원번호
1번    채치수
2번    정대만
3번    송태섭
4번    서태웅
5번    강백호
6번    변덕규
7번    황태산
8번    윤대협
Name: 이름, dtype: object
df[df.columns[-1]] # 맨 끝에 있는 값을 가져옴(df['SW특기'] 과 동일한 동작)
지원번호
1번        Python
2번          Java
3번    Javascript
4번           NaN
5번           NaN
6번             C
7번        PYTHON
8번            C#
Name: SW특기, dtype: object

슬라이싱

파이썬의 특징이며 주의사항(아닐수도 있음)

  • [0:2] : 0~1 인덱스까지 추출

  • [‘키값’:’다른키값’] : ‘키값’ 인덱스부터 ‘다른키값’ 인덱스까지 포함해서 추출

df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df['영어'][0:5] # 0~4 까지 영어 점수 데이터 가져옴
지원번호
1번    85
2번    35
3번    75
4번    60
5번    20
Name: 영어, dtype: int64
df[['이름', '키']][:3] # 처음 3명의 이름, 키 정보를 가져옴
이름
지원번호
1번 채치수 197
2번 정대만 184
3번 송태섭 168
df[3:]
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

7. 데이터 선택 (loc)

이름을 이용하여 원하는 row 에서 원하는 col 선택

  • df.loc[‘row_selection’, ‘col_selection’]
import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.loc['1번'] # index 1번에 해당하는 전체 데이터
이름         채치수
학교         북산고
키          197
국어          90
영어          85
수학         100
과학          95
사회          85
SW특기    Python
Name: 1번, dtype: object
df.loc['5번'] # index 5번에 해당하는 전체 데이터
이름      강백호
학교      북산고
키       188
국어       15
영어       20
수학       10
과학       35
사회       10
SW특기    NaN
Name: 5번, dtype: object
df.loc['1번', '국어'] # index 1번에 해당하는 국어 데이터
90
df.loc[['1번', '2번'], '영어'] # index 1번, 2번에 해당하는 영어 데이터
지원번호
1번    85
2번    35
Name: 영어, dtype: int64
df.loc[['1번', '2번'], ['영어', '수학']] # index 1번, 2번에 해당하는 영어, 수학 데이터
영어 수학
지원번호
1번 85 100
2번 35 50
# 슬라이싱 문법은 일반적으로 뒤에 있는 직전까지 가져오는데
# 아래처럼 작성시 뒤에까지 포함!!(주의)
df.loc['1번':'5번', '국어':'사회'] # index 1번부터 5번까지, 국어부터 사회까지 데이터
국어 영어 수학 과학 사회
지원번호
1번 90 85 100 95 85
2번 40 35 50 55 25
3번 80 75 70 80 75
4번 40 60 70 75 80
5번 15 20 10 35 10

8. 데이터 선택 (iloc)

위치를 이용하여 원하는 row 에서 원하는 col 선택

  • 즉, df.iloc[row_index, col_index]
import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.iloc[0] # 0번째 위치의 데이터
이름         채치수
학교         북산고
키          197
국어          90
영어          85
수학         100
과학          95
사회          85
SW특기    Python
Name: 1번, dtype: object
df.iloc[4] # 4번째 위치의 데이터
이름      강백호
학교      북산고
키       188
국어       15
영어       20
수학       10
과학       35
사회       10
SW특기    NaN
Name: 5번, dtype: object
df.iloc[0:5] # 0 ~ 4번째 위치의 데이터
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
df.iloc[0, 1] # 0번째 위치의 1번째(학교) 데이터
'북산고'
df.iloc[4, 2] # 5번 학생의 키 데이터 (4번째 위치의 2번째(키) 데이터)
188
df.iloc[[0, 1], 2] # 0, 1번째 위치의 학생의 2번째(키) 데이터
지원번호
1번    197
2번    184
Name: 키, dtype: int64
df.iloc[[0, 1], [3, 4]] # 0, 1 번째 위치의 학생의 3, 4 번째 데이터 (국어, 영어)
국어 영어
지원번호
1번 90 85
2번 40 35
df.iloc[0:5, 3:8] # 0 ~ 4 번째 위치의 학생 중에서, 3 ~ 7 번째 데이터 (국어:사회)
국어 영어 수학 과학 사회
지원번호
1번 90 85 100 95 85
2번 40 35 50 55 25
3번 80 75 70 80 75
4번 40 60 70 75 80
5번 15 20 10 35 10

9. 데이터 선택 (조건)

조건에 해당하는 데이터 선택

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df['키'] >= 185 # 학생들의 키가 185 이상인지 여부를 True / False
지원번호
1번     True
2번    False
3번    False
4번     True
5번     True
6번     True
7번     True
8번     True
Name: 키, dtype: bool
filt = (df['키'] >= 185)
df[filt] # 필터 적용을 해서 뽑아온 데이터(2,3번 데이터 행 없는것 확인)
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df[~filt] # filter 를 역으로 적용
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
df[df['키'] >= 185]
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.loc[df['키'] >= 185, '수학'] # 키가 185 이상인 학생들의 수학 데이터
지원번호
1번    100
4번     70
5번     10
6번     95
7번     45
8번     90
Name: 수학, dtype: int64
df.loc[df['키'] >= 185, ['이름', '수학', '과학']] # 키가 185 이상인 학생들의 이름, 수학, 과학 데이터
이름 수학 과학
지원번호
1번 채치수 100 95
4번 서태웅 70 75
5번 강백호 10 35
6번 변덕규 95 85
7번 황태산 45 40
8번 윤대협 90 95

다양한 조건

& 그리고

df.loc[(df['키'] >= 185) & (df['학교'] == '북산고')] # 키가 185 이상인 북산고 학생 데이터
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN

| 또는

df.loc[(df['키'] < 170) | (df['키'] > 200)] # 키가 170 보다 작거나, 200 보다 큰 학생 데이터
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
6번 변덕규 능남고 202 80 100 95 85 80 C

str 함수

pandas에서 어떤 string 함수를 사용하는지 궁금하다면?

  • pandas string 검색후 공식문서에서 확인
filt = df['이름'].str.startswith('송') # '송'씨 성을 가진 사람
df[filt]
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
filt = df['이름'].str.contains('태') # 이름에 '태'가 들어가는 사람
df[filt]
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
df[~filt] # 이름에 '태'가 들어가는 사람을 제외
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
8번 윤대협 능남고 190 100 85 90 95 95 C#
langs = ["Python", "Java"]
filt = df['SW특기'].isin(langs) # SW특기가 Python 이거나 Java 인 사람
df[filt] # SW특기가 PYTHON이라고 적혀있는 데이터는 못 가져왔다.
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
langs = ["python", "java"]
filt = df['SW특기'].str.lower().isin(langs) # 소문자로 바꾼후 inin()
df[filt] # 여기선 PYTHON 데이터도 전부 잘 가져왔다.
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
filt = df['SW특기'].str.contains('Java')
df[filt] # 에러발생. T/F가 아닌 NaN은 NaN이라고 출력되서 그럼.(contains())
df['SW특기'].str.lower().isin(langs) # 이렇게 T/F가 나와줘야 필터적용이 가능
지원번호
1번     True
2번     True
3번    False
4번    False
5번    False
6번    False
7번     True
8번    False
Name: SW특기, dtype: bool
df['SW특기'].str.contains('Java', na=True) # NaN 데이터에 대해서 True 로 설정해서 해결
지원번호
1번    False
2번     True
3번     True
4번     True
5번     True
6번    False
7번    False
8번    False
Name: SW특기, dtype: bool
df['SW특기'].str.contains('Java', na=False) # NaN 데이터에 대해서 False 로 설정해서 해결
지원번호
1번    False
2번     True
3번     True
4번    False
5번    False
6번    False
7번    False
8번    False
Name: SW특기, dtype: bool
filt = df['SW특기'].str.contains('Java', na=False)
df[filt] # 문제없이 동작
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript

10. 결측치

비어 있는 데이터를 의미

즉, 비어 있는 데이터를 어떻게 처리할지 보겠다.

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

데이터 채우기 fillna

df.fillna('') # NaN 데이터를 빈 칸으로 채움
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80
5번 강백호 북산고 188 15 20 10 35 10
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.fillna('없음')
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 없음
5번 강백호 북산고 188 15 20 10 35 10 없음
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
import numpy as np
df['학교'] = np.nan # 학교 데이터 전체를 NaN 으로 채움
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 NaN 197 90 85 100 95 85 Python
2번 정대만 NaN 184 40 35 50 55 25 Java
3번 송태섭 NaN 168 80 75 70 80 75 Javascript
4번 서태웅 NaN 187 40 60 70 75 80 NaN
5번 강백호 NaN 188 15 20 10 35 10 NaN
6번 변덕규 NaN 202 80 100 95 85 80 C
7번 황태산 NaN 188 55 65 45 40 35 PYTHON
8번 윤대협 NaN 190 100 85 90 95 95 C#
df.fillna('모름')
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 모름 197 90 85 100 95 85 Python
2번 정대만 모름 184 40 35 50 55 25 Java
3번 송태섭 모름 168 80 75 70 80 75 Javascript
4번 서태웅 모름 187 40 60 70 75 80 모름
5번 강백호 모름 188 15 20 10 35 10 모름
6번 변덕규 모름 202 80 100 95 85 80 C
7번 황태산 모름 188 55 65 45 40 35 PYTHON
8번 윤대협 모름 190 100 85 90 95 95 C#
df.fillna('모름', inplace=True)
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 모름 197 90 85 100 95 85 Python
2번 정대만 모름 184 40 35 50 55 25 Java
3번 송태섭 모름 168 80 75 70 80 75 Javascript
4번 서태웅 모름 187 40 60 70 75 80 모름
5번 강백호 모름 188 15 20 10 35 10 모름
6번 변덕규 모름 202 80 100 95 85 80 C
7번 황태산 모름 188 55 65 45 40 35 PYTHON
8번 윤대협 모름 190 100 85 90 95 95 C#
import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df['SW특기'].fillna('확인 중', inplace=True) # SW특기 데이터 중에서 NaN 에 대해서 채움
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 확인 중
5번 강백호 북산고 188 15 20 10 35 10 확인 중
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

데이터 제외하기 dropna

df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.dropna(inplace=True) # 전체 데이터 중에서 NaN 을 포함하는 데이터 삭제
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
  • axis : index or columns

  • how : any or all

df.dropna(axis='index', how='any') # NaN 이 하나라도 있는 row 삭제
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.dropna(axis='columns') # NaN 이 하나라도 있는 column 삭제
이름 학교 국어 영어 수학 과학 사회
지원번호
1번 채치수 북산고 197 90 85 100 95 85
2번 정대만 북산고 184 40 35 50 55 25
3번 송태섭 북산고 168 80 75 70 80 75
4번 서태웅 북산고 187 40 60 70 75 80
5번 강백호 북산고 188 15 20 10 35 10
6번 변덕규 능남고 202 80 100 95 85 80
7번 황태산 능남고 188 55 65 45 40 35
8번 윤대협 능남고 190 100 85 90 95 95
df['학교'] = np.nan
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 NaN 197 90 85 100 95 85 Python
2번 정대만 NaN 184 40 35 50 55 25 Java
3번 송태섭 NaN 168 80 75 70 80 75 Javascript
4번 서태웅 NaN 187 40 60 70 75 80 NaN
5번 강백호 NaN 188 15 20 10 35 10 NaN
6번 변덕규 NaN 202 80 100 95 85 80 C
7번 황태산 NaN 188 55 65 45 40 35 PYTHON
8번 윤대협 NaN 190 100 85 90 95 95 C#
df.dropna(axis='columns', how='all') # 데이터 전체가 NaN 인 경우에만 Column 삭제
이름 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 197 90 85 100 95 85 Python
2번 정대만 184 40 35 50 55 25 Java
3번 송태섭 168 80 75 70 80 75 Javascript
4번 서태웅 187 40 60 70 75 80 NaN
5번 강백호 188 15 20 10 35 10 NaN
6번 변덕규 202 80 100 95 85 80 C
7번 황태산 188 55 65 45 40 35 PYTHON
8번 윤대협 190 100 85 90 95 95 C#

11. 데이터 정렬

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.sort_values('키') # 키 기준으로 오름차순 정렬 (ascending=True로 기본값)
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
2번 정대만 북산고 184 40 35 50 55 25 Java
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
1번 채치수 북산고 197 90 85 100 95 85 Python
6번 변덕규 능남고 202 80 100 95 85 80 C
df.sort_values('키', ascending=False) # 키 기준으로 내림차순 정렬
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
6번 변덕규 능남고 202 80 100 95 85 80 C
1번 채치수 북산고 197 90 85 100 95 85 Python
8번 윤대협 능남고 190 100 85 90 95 95 C#
5번 강백호 북산고 188 15 20 10 35 10 NaN
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
4번 서태웅 북산고 187 40 60 70 75 80 NaN
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
df.sort_values(['수학', '영어']) # 수학, 영어 점수 기준으로 오름차순(수학 점수 같으면 영어 점수 기준이 됨!)
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
5번 강백호 북산고 188 15 20 10 35 10 NaN
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
2번 정대만 북산고 184 40 35 50 55 25 Java
4번 서태웅 북산고 187 40 60 70 75 80 NaN
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
8번 윤대협 능남고 190 100 85 90 95 95 C#
6번 변덕규 능남고 202 80 100 95 85 80 C
1번 채치수 북산고 197 90 85 100 95 85 Python
df.sort_values(['수학', '영어'], ascending=False) # 수학, 영어 점수 기준으로 내림차순
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
6번 변덕규 능남고 202 80 100 95 85 80 C
8번 윤대협 능남고 190 100 85 90 95 95 C#
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
2번 정대만 북산고 184 40 35 50 55 25 Java
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
5번 강백호 북산고 188 15 20 10 35 10 NaN
df.sort_values(['수학', '영어'], ascending=[True, False]) # 수학 점수는 오름차순으로, 영어 점수는 내림차순으로 정렬
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
5번 강백호 북산고 188 15 20 10 35 10 NaN
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
8번 윤대협 능남고 190 100 85 90 95 95 C#
6번 변덕규 능남고 202 80 100 95 85 80 C
1번 채치수 북산고 197 90 85 100 95 85 Python
df['키'].sort_values()
지원번호
3번    168
2번    184
4번    187
5번    188
7번    188
8번    190
1번    197
6번    202
Name: 키, dtype: int64
df['키'].sort_values(ascending=False)
지원번호
6번    202
1번    197
8번    190
5번    188
7번    188
4번    187
2번    184
3번    168
Name: 키, dtype: int64
df.sort_index()
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.sort_index(ascending=False)
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
8번 윤대협 능남고 190 100 85 90 95 95 C#
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
6번 변덕규 능남고 202 80 100 95 85 80 C
5번 강백호 북산고 188 15 20 10 35 10 NaN
4번 서태웅 북산고 187 40 60 70 75 80 NaN
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
2번 정대만 북산고 184 40 35 50 55 25 Java
1번 채치수 북산고 197 90 85 100 95 85 Python

12. 데이터 수정

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#

Column 수정

df['학교'].replace({'북산고':'상북고', '능남고':'무슨고'})
지원번호
1번    상북고
2번    상북고
3번    상북고
4번    상북고
5번    상북고
6번    무슨고
7번    무슨고
8번    무슨고
Name: 학교, dtype: object
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df['학교'].replace({'북산고':'상북고'}, inplace=True)
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 상북고 197 90 85 100 95 85 Python
2번 정대만 상북고 184 40 35 50 55 25 Java
3번 송태섭 상북고 168 80 75 70 80 75 Javascript
4번 서태웅 상북고 187 40 60 70 75 80 NaN
5번 강백호 상북고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df['SW특기'].str.lower() # 소문자로
지원번호
1번        python
2번          java
3번    javascript
4번           NaN
5번           NaN
6번             c
7번        python
8번            c#
Name: SW특기, dtype: object
df['SW특기'] = df['SW특기'].str.lower() # 적용
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 상북고 197 90 85 100 95 85 python
2번 정대만 상북고 184 40 35 50 55 25 java
3번 송태섭 상북고 168 80 75 70 80 75 javascript
4번 서태웅 상북고 187 40 60 70 75 80 NaN
5번 강백호 상북고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 c
7번 황태산 능남고 188 55 65 45 40 35 python
8번 윤대협 능남고 190 100 85 90 95 95 c#
df['SW특기'] = df['SW특기'].str.upper()
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 상북고 197 90 85 100 95 85 PYTHON
2번 정대만 상북고 184 40 35 50 55 25 JAVA
3번 송태섭 상북고 168 80 75 70 80 75 JAVASCRIPT
4번 서태웅 상북고 187 40 60 70 75 80 NaN
5번 강백호 상북고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df['학교'] = df['학교'] + '등학교' # 학교 데이터 + 등학교
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN
6번 변덕규 능남고등학교 202 80 100 95 85 80 C
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고등학교 190 100 85 90 95 95 C#

Column 추가

df['총합'] = df['국어'] + df['영어'] + df['수학'] + df['과학'] + df['사회']
df
이름 학교 국어 영어 수학 과학 사회 SW특기 총합
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN 325
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465
90 + 85 + 100 + 95 + 85
455
df['결과'] = 'Fail' # 결과 Column 을 추가하고 전체 데이터는 Fail 로 초기화
df
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Fail
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Fail
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Fail
df.loc[df['총합'] > 400, '결과'] = 'Pass' # 총합이 400보다 큰 데이터에 대해서 결과를 Pass 로 업데이트
df
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass

Column 삭제

df.drop(columns=['총합']) # 총합 Column 을 삭제
이름 학교 국어 영어 수학 과학 사회 SW특기 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# Pass
df.drop(columns=['국어', '영어', '수학']) # 국어, 영어, 수학 Column 을 삭제
이름 학교 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 75 80 NaN 325 Fail
5번 강백호 상북고등학교 188 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 85 80 C 440 Pass
7번 황태산 능남고등학교 188 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 95 95 C# 465 Pass
df # 반영하려면 inplace속성 True였죠?
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass

Row 삭제

df.drop(index='4번') # 4번 학생 데이터 row 를 삭제
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass
filt = df['수학'] < 80 # 수학 점수 80 점 미만 학생 필터링
df[filt]
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
df[filt].index
Index(['2번', '3번', '4번', '5번', '7번'], dtype='object', name='지원번호')
df.drop(index=df[filt].index)
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass
df
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass

Row 추가

df.loc['9번'] = ['이정환', '해남고등학교', 184, 90, 90, 90, 90, 90, 'Kotlin', 450, 'Pass'] # 새로운 Row 추가
df
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 NaN 325 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass
9번 이정환 해남고등학교 184 90 90 90 90 90 Kotlin 450 Pass

Cell 수정

df.loc['4번', 'SW특기'] = 'Python' # 4번 학생의 SW특기 데이터를 Python 으로 변경
df
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 Python 325 Fail
5번 강백호 상북고등학교 188 15 20 10 35 10 NaN 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass
9번 이정환 해남고등학교 184 90 90 90 90 90 Kotlin 450 Pass
df.loc['5번', ['학교', 'SW특기']] = ['능남고등학교', 'C'] # 5번 학생의 학교는 능남고등학교로, SW특기는 C로 변경
df
이름 학교 국어 영어 수학 과학 사회 SW특기 총합 결과
지원번호
1번 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455 Pass
2번 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205 Fail
3번 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380 Fail
4번 서태웅 상북고등학교 187 40 60 70 75 80 Python 325 Fail
5번 강백호 능남고등학교 188 15 20 10 35 10 C 90 Fail
6번 변덕규 능남고등학교 202 80 100 95 85 80 C 440 Pass
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240 Fail
8번 윤대협 능남고등학교 190 100 85 90 95 95 C# 465 Pass
9번 이정환 해남고등학교 184 90 90 90 90 90 Kotlin 450 Pass

Column 순서 변경

cols = list(df.columns) # 리스트 형태로 쓰려고 감싸줌
cols
['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회', 'SW특기', '총합', '결과']
df = df[[cols[-1]] + cols[0:-1]] # 맨 뒤에 있는 결과 Column 을 앞으로 가져오고, 나머지 Column 들과 합쳐서 순서 변경
df
결과 이름 학교 국어 영어 수학 과학 사회 SW특기 총합
지원번호
1번 Pass 채치수 상북고등학교 197 90 85 100 95 85 PYTHON 455
2번 Fail 정대만 상북고등학교 184 40 35 50 55 25 JAVA 205
3번 Fail 송태섭 상북고등학교 168 80 75 70 80 75 JAVASCRIPT 380
4번 Fail 서태웅 상북고등학교 187 40 60 70 75 80 Python 325
5번 Fail 강백호 능남고등학교 188 15 20 10 35 10 C 90
6번 Pass 변덕규 능남고등학교 202 80 100 95 85 80 C 440
7번 Fail 황태산 능남고등학교 188 55 65 45 40 35 PYTHON 240
8번 Pass 윤대협 능남고등학교 190 100 85 90 95 95 C# 465
9번 Pass 이정환 해남고등학교 184 90 90 90 90 90 Kotlin 450
df = df[['결과', '이름', '학교']] # 즉, 이렇게 column을 정의해줌으로써 df의 순서변경이 가능하다는 점
df
결과 이름 학교
지원번호
1번 Pass 채치수 상북고등학교
2번 Fail 정대만 상북고등학교
3번 Fail 송태섭 상북고등학교
4번 Fail 서태웅 상북고등학교
5번 Fail 강백호 능남고등학교
6번 Pass 변덕규 능남고등학교
7번 Fail 황태산 능남고등학교
8번 Pass 윤대협 능남고등학교
9번 Pass 이정환 해남고등학교

Column 이름 변경

df
결과 이름 학교
지원번호
1번 Pass 채치수 상북고등학교
2번 Fail 정대만 상북고등학교
3번 Fail 송태섭 상북고등학교
4번 Fail 서태웅 상북고등학교
5번 Fail 강백호 능남고등학교
6번 Pass 변덕규 능남고등학교
7번 Fail 황태산 능남고등학교
8번 Pass 윤대협 능남고등학교
9번 Pass 이정환 해남고등학교
df.columns
Index(['결과', '이름', '학교'], dtype='object')
df.columns = ['Result', 'Name', 'School']
df
Result Name School
지원번호
1번 Pass 채치수 상북고등학교
2번 Fail 정대만 상북고등학교
3번 Fail 송태섭 상북고등학교
4번 Fail 서태웅 상북고등학교
5번 Fail 강백호 능남고등학교
6번 Pass 변덕규 능남고등학교
7번 Fail 황태산 능남고등학교
8번 Pass 윤대협 능남고등학교
9번 Pass 이정환 해남고등학교

13. 함수 적용

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df['학교'] = df['학교'] + '등학교'
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고등학교 197 90 85 100 95 85 Python
2번 정대만 북산고등학교 184 40 35 50 55 25 Java
3번 송태섭 북산고등학교 168 80 75 70 80 75 Javascript
4번 서태웅 북산고등학교 187 40 60 70 75 80 NaN
5번 강백호 북산고등학교 188 15 20 10 35 10 NaN
6번 변덕규 능남고등학교 202 80 100 95 85 80 C
7번 황태산 능남고등학교 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고등학교 190 100 85 90 95 95 C#
df['키'] = df['키'] + 'cm'
df # 키는 정수형 데이터인데, 문자열을 이어붙히려고 해서 에러발생

데이터에 함수 적용 (apply)

유용한 함수이다(기억해두기)

# 키 뒤에 cm 을 붙이는 역할
def add_cm(height):
    return str(height) + 'cm'

df['키'] = df['키'].apply(add_cm) # 키 데이터에 대해서 add_cm 함수를 호출한 결과 데이터를 반영
df # 잘 보면 apply에 add_cm그냥 넣지 add_cm(height)처럼 인자를 따로 넣어주지 않았음.
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고등학교 197cm 90 85 100 95 85 Python
2번 정대만 북산고등학교 184cm 40 35 50 55 25 Java
3번 송태섭 북산고등학교 168cm 80 75 70 80 75 Javascript
4번 서태웅 북산고등학교 187cm 40 60 70 75 80 NaN
5번 강백호 북산고등학교 188cm 15 20 10 35 10 NaN
6번 변덕규 능남고등학교 202cm 80 100 95 85 80 C
7번 황태산 능남고등학교 188cm 55 65 45 40 35 PYTHON
8번 윤대협 능남고등학교 190cm 100 85 90 95 95 C#
def capitalize(lang):
    if pd.notnull(lang): # NaN 이 아닌지
        return lang.capitalize() # 첫 글자는 대문자로, 나머지는 소문자로 (여기함수는 원래있는 함수임)
    return lang

df['SW특기'] = df['SW특기'].apply(capitalize)
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고등학교 197cm 90 85 100 95 85 Python
2번 정대만 북산고등학교 184cm 40 35 50 55 25 Java
3번 송태섭 북산고등학교 168cm 80 75 70 80 75 Javascript
4번 서태웅 북산고등학교 187cm 40 60 70 75 80 NaN
5번 강백호 북산고등학교 188cm 15 20 10 35 10 NaN
6번 변덕규 능남고등학교 202cm 80 100 95 85 80 C
7번 황태산 능남고등학교 188cm 55 65 45 40 35 Python
8번 윤대협 능남고등학교 190cm 100 85 90 95 95 C#

14. 그룹화

동일한 값을 가진 것들끼리 합쳐서 통계 또는 평균 등의 값을 계산하기 위해 사용

import pandas as pd
df = pd.read_excel('score.xlsx', index_col='지원번호')
df
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.groupby('학교')
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000019DDFC10D30>
df.groupby('학교').get_group('북산고')
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python
2번 정대만 북산고 184 40 35 50 55 25 Java
3번 송태섭 북산고 168 80 75 70 80 75 Javascript
4번 서태웅 북산고 187 40 60 70 75 80 NaN
5번 강백호 북산고 188 15 20 10 35 10 NaN
df.groupby('학교').get_group('능남고')
이름 학교 국어 영어 수학 과학 사회 SW특기
지원번호
6번 변덕규 능남고 202 80 100 95 85 80 C
7번 황태산 능남고 188 55 65 45 40 35 PYTHON
8번 윤대협 능남고 190 100 85 90 95 95 C#
df.groupby('학교').mean() # 계산 가능한 데이터들의 평균값
국어 영어 수학 과학 사회
학교
능남고 193.333333 78.333333 83.333333 76.666667 73.333333 70.0
북산고 184.800000 53.000000 55.000000 60.000000 68.000000 55.0
df.groupby('학교').size() # 각 그룹의 크기
학교
능남고    3
북산고    5
dtype: int64
df.groupby('학교').size()['능남고'] # 학교로 그룹화를 한 뒤에 능남고에 해당하는 데이터의 수
3
df.groupby('학교')['키'].mean() # 학교로 그룹화를 한 뒤에 키의 평균 데이터
학교
능남고    193.333333
북산고    184.800000
Name: 키, dtype: float64
df.groupby('학교')[['국어', '영어', '수학']].mean() # 학교로 그룹화를 한 뒤에 국어, 영어, 수학 평균 데이터
국어 영어 수학
학교
능남고 78.333333 83.333333 76.666667
북산고 53.000000 55.000000 60.000000
df['학년'] = [3, 3, 2, 1, 1, 3, 2, 2] # 학년 Column 추가
df
이름 학교 국어 영어 수학 과학 사회 SW특기 학년
지원번호
1번 채치수 북산고 197 90 85 100 95 85 Python 3
2번 정대만 북산고 184 40 35 50 55 25 Java 3
3번 송태섭 북산고 168 80 75 70 80 75 Javascript 2
4번 서태웅 북산고 187 40 60 70 75 80 NaN 1
5번 강백호 북산고 188 15 20 10 35 10 NaN 1
6번 변덕규 능남고 202 80 100 95 85 80 C 3
7번 황태산 능남고 188 55 65 45 40 35 PYTHON 2
8번 윤대협 능남고 190 100 85 90 95 95 C# 2
df.groupby(['학교', '학년']).mean() # 학교별, 학년별 평균 데이터
국어 영어 수학 과학 사회
학교 학년
능남고 2 189.0 77.5 75.0 67.5 67.5 65.0
3 202.0 80.0 100.0 95.0 85.0 80.0
북산고 1 187.5 27.5 40.0 40.0 55.0 45.0
2 168.0 80.0 75.0 70.0 80.0 75.0
3 190.5 65.0 60.0 75.0 75.0 55.0
df.groupby('학년').mean() # 학년별 평균 데이터
국어 영어 수학 과학 사회
학년
1 187.500000 27.500000 40.000000 40.000000 55.000000 45.000000
2 182.000000 78.333333 75.000000 68.333333 71.666667 68.333333
3 194.333333 70.000000 73.333333 81.666667 78.333333 63.333333
df.groupby('학년').mean().sort_values('키')
국어 영어 수학 과학 사회
학년
2 182.000000 78.333333 75.000000 68.333333 71.666667 68.333333
1 187.500000 27.500000 40.000000 40.000000 55.000000 45.000000
3 194.333333 70.000000 73.333333 81.666667 78.333333 63.333333
df.groupby('학년').mean().sort_values('키', ascending=False)
국어 영어 수학 과학 사회
학년
3 194.333333 70.000000 73.333333 81.666667 78.333333 63.333333
1 187.500000 27.500000 40.000000 40.000000 55.000000 45.000000
2 182.000000 78.333333 75.000000 68.333333 71.666667 68.333333
df.groupby(['학교', '학년']).sum()
국어 영어 수학 과학 사회
학교 학년
능남고 2 378 155 150 135 135 130
3 202 80 100 95 85 80
북산고 1 375 55 80 80 110 90
2 168 80 75 70 80 75
3 381 130 120 150 150 110
df.groupby('학교')[['이름', 'SW특기']].count() # 학교로 그룹화를 한 뒤에 각 학교별 SW특기 데이터의 수를 가져옴
이름 SW특기
학교
능남고 3 3
북산고 5 3
# value_가 추가된 점
school = df.groupby('학교')
school['학년'].value_counts() # 학교로 그룹화를 한 뒤에 학년별 학생 수를 가져옴
학교   학년
능남고  2     2
     3     1
북산고  1     2
     3     2
     2     1
Name: 학년, dtype: int64
school['학년'].value_counts().loc['북산고'] # 학교로 그룹화를 한 뒤에 북산고에 대해서 학년별 학생 수를 가져옴
학년
1    2
3    2
2    1
Name: 학년, dtype: int64
school['학년'].value_counts().loc['능남고'] # 학교로 그룹화를 한 뒤에 능남고에 대해서 학년별 학생 수를 가져옴
학년
2    2
3    1
Name: 학년, dtype: int64
# 실제있는 데이터가 아니라 퍼센트(비율)로 나타내줌 : normalize속성 이용
school['학년'].value_counts(normalize=True).loc['북산고'] # 학생들의 수 데이터를 퍼센트로 비교하여 가져옴
학년
1    0.4
3    0.4
2    0.2
Name: 학년, dtype: float64

Pandas 퀴즈

다음은 대한민국 영화 중에서 관객 수가 가장 많은 상위 8개의 데이터입니다.

주어진 코드를 이용하여 퀴즈를 풀어보시오.

import pandas as pd
data = {
    '영화' : ['명량', '극한직업', '신과함께-죄와 벌', '국제시장', '괴물', '도둑들', '7번방의 선물', '암살'],
    '개봉 연도' : [2014, 2019, 2017, 2014, 2006, 2012, 2013, 2015],
    '관객 수' : [1761, 1626, 1441, 1426, 1301, 1298, 1281, 1270], # (단위 : 만 명)
    '평점' : [8.88, 9.20, 8.73, 9.16, 8.62, 7.64, 8.83, 9.10]
}
df = pd.DataFrame(data)
df
영화 개봉 연도 관객 수 평점
0 명량 2014 1761 8.88
1 극한직업 2019 1626 9.20
2 신과함께-죄와 벌 2017 1441 8.73
3 국제시장 2014 1426 9.16
4 괴물 2006 1301 8.62
5 도둑들 2012 1298 7.64
6 7번방의 선물 2013 1281 8.83
7 암살 2015 1270 9.10

1) 전체 데이터 중에서 ‘영화’ 정보만 출력하시오.

df['영화']
0           명량
1         극한직업
2    신과함께-죄와 벌
3         국제시장
4           괴물
5          도둑들
6      7번방의 선물
7           암살
Name: 영화, dtype: object

2) 전체 데이터 중에서 ‘영화’, ‘평점’ 정보를 출력하시오.

df[['영화', '평점']]
영화 평점
0 명량 8.88
1 극한직업 9.20
2 신과함께-죄와 벌 8.73
3 국제시장 9.16
4 괴물 8.62
5 도둑들 7.64
6 7번방의 선물 8.83
7 암살 9.10

3) 2015년 이후에 개봉한 영화 데이터 중에서 ‘영화’, ‘개봉 연도’ 정보를 출력하시오.

df.loc[df['개봉 연도'] >= 2015, ['영화', '개봉 연도']]
영화 개봉 연도
1 극한직업 2019
2 신과함께-죄와 벌 2017
7 암살 2015

4) 주어진 계산식을 참고하여 ‘추천 점수’ Column 을 추가하시오.

추천 점수 = (관객수 * 평점) // 100

예) 첫 번째 영화인 ‘명량’의 경우,

추천 점수 = (관객수 1761 * 평점 8.88) // 100 = 156

df['추천 점수'] = (df['관객 수'] * df['평점']) // 100
df
영화 개봉 연도 관객 수 평점 추천 점수
0 명량 2014 1761 8.88 156.0
1 극한직업 2019 1626 9.20 149.0
2 신과함께-죄와 벌 2017 1441 8.73 125.0
3 국제시장 2014 1426 9.16 130.0
4 괴물 2006 1301 8.62 112.0
5 도둑들 2012 1298 7.64 99.0
6 7번방의 선물 2013 1281 8.83 113.0
7 암살 2015 1270 9.10 115.0

5) 전체 데이터를 ‘개봉 연도’ 기준 내림차순으로 출력하시오.

df.sort_values('개봉 연도', ascending=False)
영화 개봉 연도 관객 수 평점 추천 점수
1 극한직업 2019 1626 9.20 149.0
2 신과함께-죄와 벌 2017 1441 8.73 125.0
7 암살 2015 1270 9.10 115.0
0 명량 2014 1761 8.88 156.0
3 국제시장 2014 1426 9.16 130.0
6 7번방의 선물 2013 1281 8.83 113.0
5 도둑들 2012 1298 7.64 99.0
4 괴물 2006 1301 8.62 112.0

댓글남기기