본문 바로가기
Python

Python (데이터 전처리 - 행/열 순서 및 이름 변경, 데이터 정렬)

by 글로리. 2020. 5. 14.

 

데이터 전처리 : 데이터를 본격적으로 분석하기전, 데이터를 가공하는 작업.

  1. 행, 열의 순서 변경
  2. 컬럼이나 인덱스의 이름 변경
  3. 데이터 정렬
  4. 데이터 검색
  5. 행, 열 추가
  6. 행, 열 삭제
  7. 두 개 이상의 데이터 프레임 병합

 

 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

 

3) 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)
 
>>> 인덱스
[01234]
 
 
# 이름 컬럼을 리스트로 추출
>>> 이름 = 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

댓글