Python Library/Pandas

[Pandas - Python] Pandas 라이브러리와 결측치 및 데이터 정렬(fillna, sort_values, sort_index)

바보1 2022. 2. 7. 21:59

이번 시간에는 결측치 채우기 및 데이터 정렬에 대해 알아보겠습니다.

 

음... 사실 보간법은 아직까지 공부하질 않아서 잘 모르겠네요 ..

 

사실 결측치 해봤자 fillna함수를 쓰는 것 뿐입니다. 아직 초보라..

 

따라서 제대로 된 보간법에 대해서 공부하시고 싶으신 분들은 다른 내용을 찾아보시는 게 좋을 것 같습니다.

 

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#

1. 결측치 바꾸기(NaN 값들을 바꾸기)

 

사실 fillna 함수를 쓰는게 다입니다. 

 

위에 보시면 SW특기 중에 4번, 5번이 NaN이죠?

 

이때 fillna('  ')을 써주시면 콤마 안의 문자들로 NaN이 채워집니다.

 

  • 기본적인 사용법
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#

이렇게 ' '를 쓰니까 NaN 값들이 빈칸이 된 것을 보실 수 있습니다.

 

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#

이런 식으로 '없음'으로도 바꿀 수 있습니다.

 

numpy에서 np.nan을 이용해서 '학교' column을 모두 NaN으로 바꿔보겠습니다.

 

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#

이렇게 만든 후에 NaN 값들을 '모름' 으로 바꾸겠습니다.

 

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#

단점이 보이네요. fillna는 모든 NaN을 동일한 값으로 바꿉니다.

 

근데 참고로 복사본을 출력하는거라 업데이트하고 싶으시면 inplace=True로 설정해주셔야 합니다.

 

 

  • 특정 column이나 row에 해당하는 NaN만 채우기

우선 특정 column에 대한 NaN만 채워보겠습니다.

 

df['SW특기'].fillna('확인 중') #SW특기 중에서 NaN에 대해서 채움
지원번호
1번        Python
2번          Java
3번    Javascript
4번          확인 중
5번          확인 중
6번             C
7번        PYTHON
8번            C#
Name: SW특기, dtype: object

이렇게 'SW특기'에 대해서만 '확인 중'으로 채웠습니다.

 

이번에는 특정 row에 대해 NaN을 채우겠습니다.

 

df.loc['4번'].fillna('모름')
이름      서태웅
학교      북산고
키       187
국어       40
영어       60
수학       70
과학       75
사회       80
SW특기     모름
Name: 4번, dtype: object

이렇게 loc를 이용해서 '4번'의 NaN을 '모름'으로 바꿨습니다.

 


2. NaN이 있는 행이나 열 삭제

 

  • dropna의 기본적인 사용법

dropna를 사용하면 됩니다.

 

df.dropna() # 전체 데이터 중에서 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#

이렇게 dropna()를 사용하시면 NaN를 포함하는 데이터의 행을 삭제합니다.

 

근데 이것도 업데이트하시려면 inplace=True를 해주셔아합니다.

 

  • dropna의 여러가지 속성

axis : index or columns (0 or 1) index는 row를 삭제, columns는 column을 삭제, ex) axis = 0 or axis = 'index'

how : any or all (any는 하나라도 있으면, all은 모두 NaN일 때)

 

원래 default 값은 axis = 0이고, how = 'any' 입니다.

 

이렇게 알아두시면 될 것 같습니다.

 

df.dropna(axis = 0, 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#

이렇게 axis = 0, how = 'any' 이면 NaN이 하나라도 있는 row를 삭제합니다.

 

이번에는 axis = 1로 바꿔보겠습니다. 참고로 axis = 'columns' 도 가능합니다.

df.dropna(axis=1, how='any')
	이름	학교	키	국어	영어	수학	과학	사회
지원번호								
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특기 column을 삭제합니다.

 

이번에는 how = 'all'로 해보겠습니다.

 

df.dropna(axis=1, how='all')
	이름	학교	키	국어	영어	수학	과학	사회	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#

모든 열이 NaN인 열이 없어서 아무것도 삭제하지 않았습니다.

 

이때, '학교' column을 모두 NaN으로 바꾸겠습니다.

 

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#

이렇게 한 후에 한 번 drop 해보겠습니다.

 

df.dropna(axis = 'columns', how = 'all')
	이름	키	국어	영어	수학	과학	사회	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 = 'columns'로 설정하고 how = 'all'으로 하니까 학교 열은 없어지고 SW 특기 열은 남아있습니다.

 

참고로 이것들도 inplace를 사용해야 업데이트가 됩니다. 혹은 df = df.dropna()를 해주셔야 합니다.

 

  • 번외

번외로 dropna가 아니라 drop도 있습니다.

 

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

이렇게 하면 axis에 해당하는 줄에서 앞의 label에 해당하는 값이 사라집니다.

 

마찬가지로 inplace가 필요합니다.

 


3. 데이터 정렬

 

아마 앞의 내용 중에서도 데이터 정렬에 관련된 내용이 있던 거로 기억합니다.

 

조금 더 자세히 다루겠습니다.

 

  • sort_values()의 기본적인 사용법

기본적으로 sort_values('column name')을 하시면 됩니다. 그러면 오름차순으로 정렬이 되는데,

 

df.sort_values('키')
	이름	학교	키	국어	영어	수학	과학	사회	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(['수학', '과학'])
	이름	학교	키	국어	영어	수학	과학	사회	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

이렇게 리스트로 넣어주시면 됩니다. 그러면 4번과 3번이 정렬된 모습을 보실 수 있습니다.

 

  • sort_values()의 속성

기본적으로 오름차순과 내림차순을 결정하는 ascending = True/False가 있습니다.

 

근데 만약 난 수학은 오름차순, 과학은 내림차순으로 하고 싶다고 하면 어떻게 해야할까요?

 

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

ascending도 똑같이 리스트로 넣어주면 됩니다.

 

그 외에도 na_position, kind등이 있는데 간략히 설명하자면, 

 

na_position = 'first' / 'last' 를 하시면 NaN 값들이 맨 처음으로 정렬될지, 마지막으로 정렬될지 결정합니다.

 

kind 는 해당 정렬 알고리즘을 설정합니다.

 

kind = 'quicksort', 'mergesort', 'heapsort', 'stable' 이렇게 있습니다.

 

필요에 따라 도큐먼트를 이용하시면 될 것 같습니다.

 

  • 부가적인 설명

참고로 DataFrame 뿐만 아니라 Series에서도 사용 가능합니다.

 

df['키'].sort_values()
지원번호
3번    168
2번    184
4번    187
5번    188
7번    188
8번    190
1번    197
6번    202
Name: 키, dtype: int64

 

 

  • sort_index()

 

말 그대로 index를 기준으로 정렬합니다.

 

속성 값으로는 ascending등이 있습니다.

 

개인적으로 생각해야하는 속성 값으로는 axis, ascending, na_position, ignore_index가 있습니다.


4. 요약

 

결측치를 그냥 채워넣는 방법으로는 fillna가 있습니다. row와 column을 기준으로 넣을 수도 있습니다.

 

그리고 dropna를 하시면 여러가지 속성 값에 의해 NaN가 들어가있는 줄을 없앨 수 있습니다.

 

또한 sort_values(), sort_index() 함수를 쓰시면 이것도 속성 값에 따라 다양한 정렬을 하실 수 있습니다.

 

감사합니다.

 

지적 환영합니다.

 

 

 

참고 : 나도코딩