데이터 전처리 : 데이터를 본격적으로 분석하기전, 데이터를 가공하는 작업.
|
1. 필요한 패키지 참조 및 샘플 데이터 준비하기.
1) 패키지 참조.
1
2
3
4
5
6
|
>>> import numpy
>>> from pandas import DataFrame # 데이터프레임 클래스
>>> from pandas import Series # 시리즈 클래스
>>> from pandas import ExcelFile # Excel 파일을 읽어들이기 위한 클래스
>>> from pandas import concat # 행단위 병합기능을 제공하는 함수
>>> from pandas import merge # 열단위 병합기능을 제공하는 함수
|
cs |
2) 샘플 데이터 준비
1
2
3
4
5
|
>>> xls = ExcelFile('http://itpaper.co.kr/demo/py/grade.xlsx')
>>> df = xls.parse(xls.sheet_names[0])
>>> df
|
cs |
< 샘플 데이터 >
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
0 | 철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
1 | 영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
2 | 민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
3 | 수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
4 | 호영 | 4 | 남자 | 120 | 50.0 | NaN | 80.0 |
샘플데이터
2. 행, 열의 순서 변경 - reindex( )
: 원본에는 변화가 없으며 결과가 적용된 복사본 반환
1) 열 순서 변경 : reindex( columns = [ '컬럼','컬럼',~~ ])
1
2
3
|
>>> df1 = df.reindex(columns=['국어', '수학', '과학', '영어', '성별', '학년'])
>>> df1
|
cs |
◆ 결과
국어 | 수학 | 과학 | 영어 | 성별 | 학년 | |
0 | 98 | 88.0 | 64.0 | NaN | 남자 | 1 |
1 | 88 | 62.0 | 72.0 | 90.0 | 여자 | 2 |
2 | 92 | NaN | NaN | 70.0 | 남자 | 1 |
3 | 63 | 31.0 | 70.0 | 60.0 | 여자 | 3 |
4 | 120 | NaN | 88.0 | 50.0 | 남자 | 4 |
- 지정되지 않은 칼럼은 제외시키고 원하는 항목만 추출 가능.
1
2
3
|
>>> df2 = df.reindex(columns=['이름', '국어','수학','영어'])
>>> df2
|
cs |
◆ 결과
이름 | 국어 | 수학 | 영어 | |
0 | 철수 | 98 | 88.0 | NaN |
1 | 영희 | 88 | 62.0 | 90.0 |
2 | 민수 | 92 | NaN | 70.0 |
3 | 수현 | 63 | 31.0 | 60.0 |
4 | 호영 | 120 | NaN | 50.0 |
2) 행 순서 변경 : reindex( index = [ '인덱스','인덱스', ~~~ ] )
1
2
3
|
>>> df3 = df.reindex(index=[1,3,2,0,4])
>>> df3
|
cs |
◆ 결과
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
1 | 영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
3 | 수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
2 | 민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
0 | 철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
4 | 호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
- 컬럼과 마찬가지로 인덱스도 원하는 인덱스만 추출 가능.
1
2
3
|
>>> df4 = df.reindex(index=[0,1,2])
>>> df4
|
cs |
◆ 결과
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
0 | 철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
1 | 영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
2 | 민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
3) 행, 열 순서 동시변경 : reindex (columns= [ '컬럼','컬럼',~~ ], index = [ '인덱스','인덱스', ~~~ ] )
1
2
3
|
>>> df5 = df.reindex(columns=['이름','국어','수학','과학','영어'],
index=[4,3,2,1,0])
>>> df5
|
cs |
◆ 결과
이름 | 국어 | 수학 | 과학 | 영어 | |
4 | 호영 | 120 | NaN | 88.0 | 50.0 |
3 | 수현 | 63 | 31.0 | 70.0 | 60.0 |
2 | 민수 | 92 | NaN | NaN | 70.0 |
1 | 영희 | 88 | 62.0 | 72.0 | 90.0 |
0 | 철수 | 98 | 88.0 | 64.0 | NaN |
3. 컬럼, 인덱스의 이름 변경 - rename( )
- "기존이름" : "새이름" 형식의 딕셔너리로 저장
- 순서변경과 마찬가지로 원본에는 변화 없음.
1) 컬럼 이름 변경 : rename( columns = {"기존이름" : "새이름"}, {"기존이름" : "새이름"}, ~~~~)
1
2
3
|
>>> df6 = df.rename(columns={'국어':'kor', '영어':'eng', '수학':'math', '과학': 'sinc'})
>>> df6
|
cs |
◆ 결과
이름 | 학년 | 성별 | kor | eng | math | sinc | |
0 | 철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
1 | 영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
2 | 민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
3 | 수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
4 | 호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
2) 인덱스 이름 변경 : rename ( index = {"기존이름" : "새이름"}, {"기존이름" : "새이름"}, ~~~~)
1
2
3
|
>>> df7 = 성적표.rename(index={0: '학생1', 1: '학생2', 2: '학생3'} )
>>> df7
|
cs |
◆ 결과
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
학생1 | 철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
학생2 | 영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
학생3 | 민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
3 | 수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
4 | 호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
rename( ) 함수를 사용한 외부 데이터 처리시의 전처리
)- 외부에서 가져온 데이터(csv, xlsx파일 등)의 경우 인덱스 이름이 없고,
모든값이 컬럼으로 형성되기 때문에 기준컬럼을 인덱스로 지정하는 전처리 필요
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# 인덱스를 리스트로 추출
>>> 인덱스 = list(df.index)
>>> 인덱스
[0, 1, 2, 3, 4]
# 이름 컬럼을 리스트로 추출
>>> 이름 = list(df['이름'])
>>> 이름
['철수', '영희', '민수', '수현', '호영']
# 딕셔너리로 묶기
>>> index_a = {}
for i, v in enumerate(이름):
# `이름`의 i번째에 대응되는 항목을 `인덱스`에서 가져옴
before = 인덱스[i];
index_a[before] = v
>>> index_a
{0: '철수', 1: '영희', 2: '민수', 3: '수현', 4: '호영'}
# 추출결과를 데이터 프레임에 반영
>>> df.rename(index=index_a, inplace=True)
>>> df
|
cs |
◆ 결과
이름 | 학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
철수 | 철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
민수 | 민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
수현 | 수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
호영 | 호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
< 필요없어진 '이름' 컬럼 삭제 : drop ( [ '컬럼' ], axis = 1 )>
- 인덱스와 이름이 중복 되므로 '이름' 컬럼을 삭제,
1
2
3
|
>>> df.drop(['이름'], axis=1, inplace=True)
>>> df
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
4. 데이터 정렬 - sort( )
1) 특정 열로 오름차순(순차) 정렬
1
2
3
|
>>> 오름차순 = 성적표.sort_values('국어')
>>> 오름차순
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
2) 특정 열로 내림차순(역순) 정렬
- 역순 정렬시에는 ascending=False 를 적용해야 한다.
1
2
3
|
>>> 내림차순 = 성적표.sort_values('국어', ascending=False)
>>> 내림차순
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
3) 두 개 이상의 컬럼을 기준으로 정렬
- 국어점수가 동일시 수학점수 순으로 정렬
1
2
3
|
>>> 성적표.sort_values(['국어', '수학'], inplace=True)
>>> 성적표
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
4) 인덱스를 기준으로 정렬
- 숫자는 0,1,2 ~ 순으로, 한글은 가나다 순으로 정렬
< 순차정렬 >
1
2
3
|
>>> 인덱스정렬 = 성적표.sort_index()
>>> 인덱스정렬
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
< 순차정렬 >
1
2
3
|
>>> 성적표.sort_index(ascending=False, inplace=True)
>>> 성적표
|
cs |
◆ 결과
학년 | 성별 | 국어 | 영어 | 수학 | 과학 | |
호영 | 4 | 남자 | 120 | 50.0 | NaN | 88.0 |
철수 | 1 | 남자 | 98 | NaN | 88.0 | 64.0 |
영희 | 2 | 여자 | 88 | 90.0 | 62.0 | 72.0 |
수현 | 3 | 여자 | 63 | 60.0 | 31.0 | 70.0 |
민수 | 1 | 남자 | 92 | 70.0 | NaN | NaN |
'Python' 카테고리의 다른 글
Python (데이터 전처리 - 행/열 삭제 및 병합) (0) | 2020.05.15 |
---|---|
Python (데이터 전처리 - 데이터검색, 행/열 추가) (0) | 2020.05.15 |
Python(DataFrame) (0) | 2020.05.14 |
Python ( pandas ) (0) | 2020.05.14 |
Python (반복문) (0) | 2020.05.13 |
댓글