본문 바로가기

코딩/데이터분석

[Python/파이썬] Pandas 기초 정리 : 원소 바꾸기, dropna(), fillna()

반응형

※ 이 글을 쓰는 사람은 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으로 인식된다.

 

<df_test.xlsx>

 

<위 엑셀파일 데이터프레임화 결과>

   이름     국어    영어    수학  합계
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( )

 

pandas.DataFrame.dropna — pandas 1.2.4 documentation

Determine if rows or columns which contain missing values are removed. Changed in version 1.0.0: Pass tuple or list to drop on multiple axes. Only a single axis is allowed.

pandas.pydata.org

2. fillna( )

 

pandas.DataFrame.fillna — pandas 1.2.4 documentation

If method is specified, this is the maximum number of consecutive NaN values to forward/backward fill. In other words, if there is a gap with more than this number of consecutive NaNs, it will only be partially filled. If method is not specified, this is t

pandas.pydata.org

 

728x90