본문 바로가기
Python 파이썬/pandas

pandas ) 누락 데이터 처리 isnull(), dropna(), fillna(), replace()

by 하이방가루 2022. 4. 4.
728x90
반응형

isnull()

  누락데이터이면 True를 아니면 False를 반환한다. 반대로 notnull()은 누락데이터이면 False를 아니면 True를 반환한다.

  직관적으로 누락데이터만을 확인할 수 있다.

import pandas as pd
import seaborn as sns

titanic = sns.load_dataset('titanic')

# 각 열(axis=0)의 누락데이터 합 보기
print(titanic.isnull().sum())
# tip : 행으로 계산하려면 sum(axis=1)

실행결과

survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64

 

dropna()

  옵션에 따라서 열이나 행을 삭제한다.

 

누락데이터가 많은 열(컬럼) 삭제하기

# ~ 생략 ~
# 누락데이터가 500개 이상인 컬럽을 삭제
df_thresh = titanic.dropna(axis=1, thresh=500)
print(df_thresh.isnull().sum())

실행결과

survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
embark_town      2
alive            0
alone            0
dtype: int64

특정 열에 누락데이터가 있는 행(인덱스)을 제거하기

# ~ 생략 ~
# age컬럼에 누락데이가 있는 행(인덱스)을 제거
df_age = df_thresh.dropna(
	subset=['age'], # 열 선택
#	 axis=0, # 축 선택 defualt : 0
#    how='any' # 방법 선택,
# 하나라도 누락데이터가 있으면 삭제 - 'any'(default) / 행 전체가 모두 누락데이터이면 삭제 - 'all'
)
print(df_thresh.notnull().sum())
print()
print(df_age.notnull().sum())

실행결과

survived       891
pclass         891
sex            891
age            714
sibsp          891
parch          891
fare           891
embarked       889
class          891
who            891
adult_male     891
embark_town    889
alive          891
alone          891
dtype: int64

survived       714
pclass         714
sex            714
age            714
sibsp          714
parch          714
fare           714
embarked       712
class          714
who            714
adult_male     714
embark_town    712
alive          714
alone          714
dtype: int64

 

fillna()

  누락 데이터를 다른 값으로 치환한다.

 

특정 값으로 치환

# age 컬럼의 누락데이터를 age의 평균값으로 치환
df_age2 = df_thresh.copy()
print(df_age2['age'].head(10))
print()

mean_age = int(df_age2['age'].mean())
print(mean_age)
print()

df_age2['age'].fillna(mean_age, inplace=True)
print(df_age2['age'].head(10))

실행결과

0    22.0
1    38.0
2    26.0
3    35.0
4    35.0
5     NaN
6    54.0
7     2.0
8    27.0
9    14.0
Name: age, dtype: float64

29

0    22.0
1    38.0
2    26.0
3    35.0
4    35.0
5    29.0
6    54.0
7     2.0
8    27.0
9    14.0
Name: age, dtype: float64

 

인접한 값으로 치환

# embark_town의 누락 데이터에 인접한 값으로 치환
df_embark = df_thresh.copy()
print(df_embark['embark_town'][825:831]) ;print()

df_embark['embark_town'].fillna(method='ffill',inplace=True)
# 'ffill' 앞(front)에 값으로,'bfill' 뒤(back)에 값으로 대체
print(df_embark['embark_town'][825:831])

실행결과

825     Queenstown
826    Southampton
827      Cherbourg
828     Queenstown
829            NaN
830      Cherbourg
Name: embark_town, dtype: object

825     Queenstown
826    Southampton
827      Cherbourg
828     Queenstown
829     Queenstown
830      Cherbourg
Name: embark_town, dtype: object

 

replace()

  replace() 함수는 요소를 바꿔주는 함수이지만 누락데이터를 처리할 때에도 쓸 수 있다.

  보통 누락 데이터는 np.nan을 넣는 경우가 많지만 '?','-' 등 기호가 들어가 있을 경우에는 이전에 함수들로는 처리할 수 없기 때문에 replace()함수를 써서 np.nan으로 바꾼 뒤 이전에 함수들로 처리하거나 평균 등 특정 값으로 바꾸어 넣을 수 있다.

728x90
반응형

댓글