import pandas as pd
train_data = pd.read_csv('./train.csv')
train_data.head()
NaN (Not a Number) 데이터
In computing, NaN, standing for Not a Number, is a member of a numeric data type that can be interpreted as a value that is undefined or unrepresentable, especially in floating-point arithmetic.
표현 불가능한 수치형 데이터를 NaN 데이터 라고한다.
train.shape를 통해 확인한 train의 DataFrame 형태는 891 * 12 의 형태로, 즉 891개의 데이터와 12개의 feature로 이루어져 있는 것을 알 수 잇다. 만약, train이 온전한 데이터를 가지고 있다면 각 feature마다 891개의 데이터가 채워져 있어야 할 것이다.
train_data.info()
하지만 info()를 통해 train의 정보를 출력하자, Age, Cabin, Embarked feature에서 데이터가 누락된 것을 확인할 수 있다. (각 feautre에 채워진 데이터 갯수가 891개가 아니기 때문이다.) 이렇게 누락된 데이터 자리에는 NaN 값으로 채워져 있으며, NaN 데이터 갯수는 다음과 같이 확인할 수 있다.
# isna() : NaN인지 아닌지를 boolean 데이터로 반환
# sum() : 반환된 boolean 데이터 중 True인 값만 count
train_data.isna().sum()
NaN 데이터가 Age에는 177개, Cabin에는 687개, Embarked에는 2개 있는 것을 확인할 수 있다.
머신러닝 알고리즘이 작동하기 위해서는 각 feature를 수치형 데이터로 채워 feature vector로 만들어야 한다. 이 과정을 feature engineering 이라고 하며, 그 과정 중에 하나가 NaN 데이터를 처리하는 과정이다.
NaN 데이터 삭제하기
dropna 함수를 사용해 NaN 데이터가 있는 row를 삭제할 수 있다.
# DataFrame.dropna( axis=0, how='any', thresh=None, subset=None, inplace=False )
# axis = 0 (row) 혹은 1 (column)
# how = 'any' 일 경우, label 중 하나만 NaN이어도 해당 label을 삭제함.
# how = 'all' 일 경우, label 의 모든 데이터가 NaN이어야 해당 label을 삭제함.
# subset 다른 축(axis)의 어떤 label를 고려해야 하는지 list형태로 지정
# NaN이 포함된 모든 row를 삭제했기 때문에 데이터가 183개로 줄어들었다.
train_data.dropna()
# 'Age'의 데이터가 NaN인 row만 삭제한다.
train_data.dropna( subset=[ 'Age' ] )
# column 중 NaN 데이터가 있는 column의 feature을 삭제한다.
train_data.dropna( axis = 1 )
NaN 데이터 대체하기
fillna 함수를 사용해 NaN 데이터를 원하는 data로 대체할 수 있다.
# DataFrame.fillna( value=None, method=None, axis=None, inplace=False, limit=None, downcast=None )
# value = 스칼라, dict, Series, DataFrame 만 넣을 수 있다.
# Age의 NaN 데이터를 전체 나이의 평균으로 채운다.
train_data[ 'Age' ].fillna( train_data[ 'Age' ].mean() )
# 생존자는 생존자 나이 평균으로, 사망자는 사망자 나이 평균으로 채운다.
mean1 = train_data[ train_data[ 'Survived' ] == 1 ][ 'Age' ].mean()
mean0 = train_data[ train_data[ 'Survived' ] == 0 ][ 'Age' ].mean()
train_data[ train_data[ 'Survived' ] == 1 ][ 'Age' ].fillna( mean1 )
train_data[ train_data[ 'Survived' ] == 0 ][ 'Age' ].fillna( mean0 )
# 위 코드는 fillna 함수의 inplace 속성이 False 이기 때문에, 값이 원본에 저장되지 않는다.
train_data.loc( train_data[ 'Survived' ] == 1, 'Age' ) = train_data[ train_data[ 'Survived' ] == 1 ][ 'Age' ].fillna( mean1 )
train_data.loc( train_data[ 'Survived' ] == 0, 'Age' ) = train_data[ train_data[ 'Survived' ] == 0 ][ 'Age' ].fillna( mean0 )
# 'Age' 속성이 생존자 평균 나이인 row를 출력
train_data[ train_data[ 'Age' ] == mean1 ]
'데이터 사이언스 메뉴얼 > pandas' 카테고리의 다른 글
파이썬 Pandas groupby 이해하고 활용하기 -2 (0) | 2020.04.06 |
---|---|
파이썬 Pandas groupby 이해하고 활용하기 -1 (0) | 2020.04.05 |
파이썬 Pandas DataFrame column 추가 / 삭제하기 (0) | 2020.03.16 |
파이썬 Pandas Data 선택하기 (0) | 2020.03.12 |
파이썬 Pandas DataFrame 생성하기 - 2 (0) | 2020.02.29 |
최근댓글