티스토리 뷰

Python/Process

[Python] NA, NaN, Null

Aaron 2019. 2. 7. 21:43
반응형

  R에서의 NA는 '잘못된 값', Null은 '아직 정해지지 않은 값'으로, 서로 다른 의미를 가지고 있었습니다.


파이썬에서는 R과 다르게 NaN(NA)와 Null 을 '정해지지 않은 값' 의 의미로 같이 사용합니다.

그렇기 때문에 NaN으로 Na와 Null을 모두 표현합니다. 



# NA 사용 방법

from pandas import Series, DataFrame

Series([1,2,3,np.nan])

0    1.0

1    2.0

2    3.0

3    NaN

dtype: float64    # NaN 값 때문에 데이터 타입이 float


from numpy import nan as NA    # np.nan 사용이 번거로울 경우 alias 사용

Series([1,2,3,NA])

0    1.0

1    2.0

2    3.0

3    NaN

dtype: float64




# NA 검사

s1 = Series([1,2,3,NA])

s1.isnull()  ==  pd.isnull(s1)

0    False

1    False

2    False

3     True

dtype: bool


s1.isnull().sum()    # null의 개수 확인

1


s1.isnull().all()      # 데이터가 모두 null 인지 검사

False


s1.isnull().any()    # null 이 하나라도 있는지 검사

True


 

 

# NA 치환

df1.fillna?

df1.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)

# inplace 옵션 = 원본 데이터를 수정할 것인지 여부


1. fillna 메서드를 활용한 치환

df1 = DataFrame({'a':[1,2,3,NA,5],

                 'b':['a','b','c',NA,'e'],

                 'c':[100,NA,500,NA,300]})

df1

a b c

0 1.0 a 100.0

1 2.0 b NaN

2 3.0 c 500.0

3 NaN NaN NaN

4 5.0 e 300.0

df1.fillna(0)     # 모든 Na 값을 0 으로 치환

a b c

0 1.0 a 100.0

1 2.0 b 0.0

2 3.0 c 500.0

3 0.0 0 0.0

4 5.0 e 300.0

df1.fillna({'a':'a', 'b':'b', 'c':'c'})   # Na를 각 컬럼별 치환

df1.fillna(method = 'ffill')    # 이전 행 데이터로 치환

a b c

0 1.0 a 100.0

1 2.0 b 100.0

2 3.0 c 500.0

3 3.0 c 500.0

4 5.0 e 300.0

df1.fillna(method = 'bfill')   # 이후 행 데이터로 치환

        a b c

0 1.0 a 100.0

1 2.0 b 500.0

2 3.0 c 500.0

3 5.0 e 300.0

4 5.0 e 300.0


2. isnull 메서드를 활용한 치환

s1 = Series([1,2,3,NA])

s1[s1.isnull()] = 0    # Na 값을 0으로 치환

s1.astype('int')     

0    1

1    2

2    3

3    0

dtype: int32




# NA 포함 행 삭제

df3.dropna?

df3.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

df1 = DataFrame({'a':[1,2,3,NA,5],

                 'b':['a','b','c',NA,'e'],

                 'c':[100,NA,500,NA,300]})

df1

df1.dropna()     # Na값을 하나라도 포함하는 행 삭제 (default : how='any', axis=0)

df1.dropna(how='all')    # 행 전체가 Na인 행만 삭제

df1.dropna(thresh = 2)   # Na가 아닌 값이 n개인 행 출력



# NA 연산

df1 = DataFrame({'a':[1,2,3,4], 'b':[5,6,NA,8]})


df1 + 1    # NA 연산 불가능

df1.sum(axis=0  # sum 연산 가능

a    10.0

b    19.0

dtype: float64

round(df1.mean(),2)   # mean 연산 가능 (Na값 무시 : count X)

a    2.50

b    6.33

dtype: float64

round(df1.mean(skipna=False),2)   # skipna = False 설정 시, Na를 연산에 포함

a    2.5

b    NaN

dtype: float64


Pandas의 특징으로 산술 통계 메서드 사용 시 Na는 자동으로 무시되고 연산이 작동

(단, Numpy의 array구조는 불가능 => Na 값이 있다면 결과도 무조건 Na)





반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday