※ 이 글을 쓰는 사람은 SW 비전공자입니다.
※ 개인 공부를 위해 정리하는 글이며, 작성한 코드들은 효율성, 깔끔함(?) 등과는 거리가 멀 수 있습니다.
1편 : 2021.03.31 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Series, Dataframe 개념 정리
2편 : 2021.04.01 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : 엑셀 파일(.xlsx) Dataframe으로 만들기
3편 : 2021.04.03 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 내부 데이터 조회 방법
4편 : 2021.04.05 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 추가 방법
5편 : 2021.04.11 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 삭제하기(drop 함수)
6편 : 2021.04.13 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : 원소바꾸기, dropna(), fillna()
7편 : 2021.04.24 - [코딩/Python] - [Python/파이썬] Pandas Dataframe 결합 : Concat
8편 : 2021.04.25 - [코딩/Python] - [Python/파이썬] Pandas Dataframe 결합 : Merge
1) Dataframe의 행, 열 이름 변경
2) Dataframe 조회 -. 인덱싱 -. 슬라이싱 -. 열 조회 -. 원소 조회
3) 행 열 추가하기
4) 행 삭제하기(drop)
4) 원소값 바꾸기
5) 결측치(NaN) 관련 |
오늘은 데이터프레임의 원소값을 바꾸는 방법과 결측치(NaN)을 처리하는 방법에 대해 정리하였다.
데이터프레임과 원본은 이전편과 그대로 사용 한다.
<이전 데이터프레임 코드>
import pandas as pd
#dataframe 생성(엑셀 파일 통해 생성)
df = pd.read_excel("df_test.xlsx", engine="openpyxl")
print(df)
이름 국어 영어 수학
0 YB 100 90 80
1 SW 70 60 50
2 EJ 40 30 20
3 HJ 10 5 1
1. 원소값 바꾸기
말 그대로 데이터 프레임의 특정 위치 원소값을 바꾸는 방법이다. 블로그 내용에 따르면 크게 2가지 방법이 있다. iloc( ) 와 loc( )함수를 사용하는 것이다. ioc( ) 와 loc( ) 는 이전 'Dataframe 데이터 조회하기'에서 다룬 적이 있다.
관련 포스팅 : 2021.04.03 - [코딩/Python] - [Python/파이썬] Pandas 기초 정리 : Dataframe 내부 데이터 조회 방법 |
간략히 요약하면 iloc( ) 는 데이터프레임의 숫자 인덱싱으로 위치에 접근하는 방식이고, loc( ) 는 실제 이름으로 접근하는 방식이다. 이전에는 조회를 했던 방식이라면 이번에는 같은 인덱싱 방법으로
1) iloc( ) 사용
<코드>
df.iloc[0,3] = "수정"
print(df)
이름 국어 영어 수학
0 YB 100 90 수정
1 SW 70 60 50
2 EJ 40 30 20
3 HJ 10 5 1
-. 파이썬의 인덱싱 번호는 0부터 시작함을 기억하자. [0,3]은 첫번째 해의 4번째 요소(YB의 수학)을 뜻한다.
2) loc( ) 사용
<코드>
df.loc[0,'수학'] = "0점"
df.loc[1,'영어'] = "0점"
print(df)
이름 국어 영어 수학
0 YB 100 90 0점
1 SW 70 0점 50
2 EJ 40 30 20
3 HJ 10 5 1
-. loc는 인덱스와 컬럼명으로 접근하여 수정 가능
2. 결측치(NaN) 관련
결측치란 데이터프레임에서 값이 없는 것을 의미한다. 값이 없다는 것은 ""와 같은빈칸이 표시되는 것이 아니라 NaN이라는 결측치로 표시된다. DB에서 'null'과 같은 개념인 것 같다. 실제 규모가 큰 데이터프레임에서 이 NaN을 제거하는 전처리가 굉장히 중요하다고 한다.
(NaN : Not a Number)
이 결측치를 제거하는 방법은 크게 pandas의 dropna( ), fillna( ) 함수를 사용하는 방법이 있다. dropna는 결측치 NaN를 제거하는 방법이고, fillna( )는 다른 데이터로 채우는 방법이다.
결측치를 임의로 생성하기 위해 엑셀파일을 조금 수정해보았다. 엑셀파일의 빈칸은 데이터프레임에서 NaN으로 인식된다.
<위 엑셀파일 데이터프레임화 결과>
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80.0 NaN
1 SW 70.0 60.0 50.0 NaN
2 EJ 40.0 NaN 20.0 NaN
3 HJ 10.0 5.0 1.0 NaN
4 KY NaN NaN NaN NaN
1) drona( )
dropna( )는 결측치를 제거한다. 여러 파라미터에 따라 어떻게 결측치가 제거되는지 정리해보았다.
A. 그냥 dropna( )를 사용할경우 결측치가 1개라도 있는 행(or열) 모두 제거
-. axis=0이면 행 기준으로 제거(default이므로 파라미터 생략해도 됨)
-. NaN이 모든 행에 있으므로 결과는 empty DataFrame인 것을 확인
<코드>
df.dropna(inplace=True)
print("제거 후")
print(df)
제거 후
Empty DataFrame
Columns: [이름, 국어, 영어, 수학, 합계]
Index: []
-. axis=1이면 열 기준으로 '이름'열만 살아남는다.
<코드>
df.dropna(axis=1, inplace=True)
print("제거 후")
print(df)
제거 후
이름
0 YB
1 SW
2 EJ
3 HJ
4 KY
B. 특정 열의 결측치만 제거하고싶은 경우 subset 파라미터를 사용한다.
-. 아래 코드는 '영어' 컬럼의 결측치가 있는 행을 제거한다.(2번,4번 인덱스 행 제거)
-. axis=0은 생략해도 무관(default값)
<코드>
df.dropna(subset=['영어'], axis = 0, inplace=True)
print(df)
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80.0 NaN
1 SW 70.0 60.0 50.0 NaN
3 HJ 10.0 5.0 1.0 NaN
C. 1개의 열이 모두 결측치이거나 1개의 행이 모두 결측치인 경우를 how='all' 파라미터를 사용
-. axis=1(열 기준)으로 지정하여 실행하면 모든 값이 결측치였떤 '합계'열이 삭제 됨
-. axis=0으로 하면 모든 값이 결측치인 행이 없으므로 데이터프레임은 그대로임.
<코드>
df.dropna(how='all', axis=1, inplace=True)
print("제거 후")
print(df)
제거 후
이름 국어 영어 수학
0 YB 100.0 90.0 80.0
1 SW 70.0 60.0 50.0
2 EJ 40.0 NaN 20.0
3 HJ 10.0 5.0 1.0
4 KY NaN NaN NaN
D. 결측치가 아닌 데이터(non-NA) 개수를 기준으로 해서 행(or열)을 제거하려면 thresh 파라미터를 사용한다.
-. 결측치 아닌 data가 3개이상인 경우를 제외한 나머지 행 삭제(thresh=3)
-. 결과를 보면 알겠지만 결측치가 아닌 data가 3개 이하인 4번 행만 삭제된 것으로 확인
<코드>
import pandas as pd
#dataframe 생성(엑셀 파일 통해 생성)
df = pd.read_excel("df_test.xlsx", engine="openpyxl")
print("제거 전")
print(df)
df.dropna(thresh=3, inplace=True)
print("제거 후")
print(df)
제거 전
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80.0 NaN
1 SW 70.0 60.0 50.0 NaN
2 EJ 40.0 NaN 20.0 NaN
3 HJ 10.0 5.0 1.0 NaN
4 KY NaN NaN NaN NaN
제거 후
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80.0 NaN
1 SW 70.0 60.0 50.0 NaN
2 EJ 40.0 NaN 20.0 NaN
3 HJ 10.0 5.0 1.0 NaN
2) fillna( )
dropna( )는 결측치가 있는 행 또는 열을 제거하였다면 fillna( ) 는 결측치가 있는 행을 채우는 함수이다. fillna( ) 도 dropna( ) 와 같이 파라미터가 여러개 있지만 잘쓸 것같은 부분만 2가지정도 정리하고 나머지는 참고링크로 대체
A. 결측치(NaN)인 곳 모두 똑같은 값으로 채우기
-. dataframe.fillna('채울 값') 을 사용하면 아래와 같이 NaN이 모두 동일한 값으로 채워진다.
<코드>
import pandas as pd
#dataframe 생성(엑셀 파일 통해 생성)
df = pd.read_excel("df_test.xlsx", engine="openpyxl")
print("원본")
print(df)
df.fillna(0, inplace=True)
print("채운 후")
print(df)
원본
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80.0 NaN
1 SW 70.0 60.0 50.0 NaN
2 EJ 40.0 NaN 20.0 NaN
3 HJ 10.0 5.0 1.0 NaN
4 KY NaN NaN NaN NaN
채운 후
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80.0 0.0
1 SW 70.0 60.0 50.0 0.0
2 EJ 40.0 0.0 20.0 0.0
3 HJ 10.0 5.0 1.0 0.0
4 KY 0.0 0.0 0.0 0.0
B. 특정 열마다 다른 값으로 채우고 싶다면 value 파라미터를 사용한다.
-. 아래 코드와 같이 value에 대한 값은 딕셔너리 형태로 입력하면 된다.
<코드>
import pandas as pd
#dataframe 생성(엑셀 파일 통해 생성)
df = pd.read_excel("df_test.xlsx", engine="openpyxl")
print("원본")
print(df)
values = {'수학':"0점", '합계':"아직계산X"}
df.fillna(value=values, inplace=True)
print("채운 후")
print(df)
원본
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80.0 NaN
1 SW 70.0 60.0 50.0 NaN
2 EJ 40.0 NaN 20.0 NaN
3 HJ 10.0 5.0 1.0 NaN
4 KY NaN NaN NaN NaN
채운 후
이름 국어 영어 수학 합계
0 YB 100.0 90.0 80 아직계산X
1 SW 70.0 60.0 50 아직계산X
2 EJ 40.0 NaN 20 아직계산X
3 HJ 10.0 5.0 1 아직계산X
4 KY NaN NaN 0점 아직계산X
※ 참고링크
1. dropna( )
2. fillna( )
'코딩 > 데이터분석' 카테고리의 다른 글
[Python/파이썬] Numpy 기초 2편 : numpy의 여러가지 연산 (1) | 2021.06.30 |
---|---|
[Python/파이썬] Numpy 기초 1편 : Array 생성 및 인덱싱,슬라이싱 (0) | 2021.06.29 |
[Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 삭제하기(drop 함수) (2) | 2021.04.11 |
[Python/파이썬] Pandas 기초 정리 : Dataframe 행, 열 추가 방법 (0) | 2021.04.05 |
[Python/파이썬] Pandas 기초 정리 : Dataframe 내부 데이터 조회 방법 (0) | 2021.04.03 |