Pandas
파이썬에서 사용하는 데이터 분석 라이브러리
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
-20
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#']}
['채치수', '정대만', '송태섭', '서태웅', '강백호', '변덕규', '황태산', '윤대협']
[197, 184, 168, 187, 188, 202, 188, 190]
DataFrame 객체 생성
import pandas as pd
df = pd.DataFrame(data)
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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# |
데이터 접근
0 채치수
1 정대만
2 송태섭
3 서태웅
4 강백호
5 변덕규
6 황태산
7 윤대협
Name: 이름, dtype: object
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# |
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를 만듬
|
지원번호 |
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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# |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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() 이런식으로 다시 변수 재정의해서 데이터 바로 반영도 가능
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 를 설정
|
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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# |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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)
Index(['1번', '2번', '3번', '4번', '5번', '6번', '7번', '8번'], dtype='object', name='지원번호')
Index(['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회', 'SW특기'], dtype='object')
df.shape # row, column (8x9)
(8, 9)
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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
168
202
df['키'].nlargest(3) # 키 큰 사람 순서대로 3명 데이터
지원번호
6번 202
1번 197
8번 190
Name: 키, dtype: int64
188.0
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)
지원번호
1번 채치수
2번 정대만
3번 송태섭
4번 서태웅
5번 강백호
6번 변덕규
7번 황태산
8번 윤대협
Name: 이름, dtype: object
지원번호
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)
Index(['이름', '학교', '키', '국어', '영어', '수학', '과학', '사회', 'SW특기'], dtype='object')
'이름'
'키'
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
슬라이싱
파이썬의 특징이며 주의사항(아닐수도 있음)
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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# |
이름 채치수
학교 북산고
키 197
국어 90
영어 85
수학 100
과학 95
사회 85
SW특기 Python
Name: 1번, dtype: object
이름 강백호
학교 북산고
키 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 |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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# |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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# |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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)
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 에 대해서 채움
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 을 포함하는 데이터 삭제
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 |
지원번호
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
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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)
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 |
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 |
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 |
|
이름 |
학교 |
키 |
국어 |
영어 |
수학 |
과학 |
사회 |
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 이름 변경
|
결과 |
이름 |
학교 |
지원번호 |
|
|
|
1번 |
Pass |
채치수 |
상북고등학교 |
2번 |
Fail |
정대만 |
상북고등학교 |
3번 |
Fail |
송태섭 |
상북고등학교 |
4번 |
Fail |
서태웅 |
상북고등학교 |
5번 |
Fail |
강백호 |
능남고등학교 |
6번 |
Pass |
변덕규 |
능남고등학교 |
7번 |
Fail |
황태산 |
능남고등학교 |
8번 |
Pass |
윤대협 |
능남고등학교 |
9번 |
Pass |
이정환 |
해남고등학교 |
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# |
<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) 전체 데이터 중에서 ‘영화’ 정보만 출력하시오.
0 명량
1 극한직업
2 신과함께-죄와 벌
3 국제시장
4 괴물
5 도둑들
6 7번방의 선물
7 암살
Name: 영화, dtype: object
2) 전체 데이터 중에서 ‘영화’, ‘평점’ 정보를 출력하시오.
|
영화 |
평점 |
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 |
댓글남기기