이번 시간에는 결측치 채우기 및 데이터 정렬에 대해 알아보겠습니다.
음... 사실 보간법은 아직까지 공부하질 않아서 잘 모르겠네요 ..
사실 결측치 해봤자 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() 함수를 쓰시면 이것도 속성 값에 따라 다양한 정렬을 하실 수 있습니다.
감사합니다.
지적 환영합니다.
참고 : 나도코딩
'Python Library > Pandas' 카테고리의 다른 글
[Pandas - Python] Pandas 라이브러리와 함수 적용 (0) | 2022.02.08 |
---|---|
[Pandas - Python] Pandas 라이브러리와 데이터 수정(Column과 Row, Cell) (0) | 2022.02.07 |
[Pandas - Python] Pandas 라이브러리와 데이터 검색(조건) (0) | 2022.02.07 |
[Pandas - Python] Pandas 라이브러리와 데이터의 선택(loc, iloc) (0) | 2022.02.07 |
[Pandas - Python] Pandas 라이브러리와 데이터 확인 및 선택(기본) (0) | 2022.02.05 |