프로그래밍 언어/파이썬

누락값 처리하기

eunsour 2020. 8. 27.
반응형

※ 누락값이란?

1. 누락값과 누락값 확인하기

누락값(NaN)은 NaN, NAN, nan과 같은 방법으로 표기할 수 있다. 

누락값을 파이썬에 사용하려면 넘파이(numpy) 라이브러리가 필요하다. 넘파이 라이브러리는 수학이나 과학 연산을 위해 만든 파이썬 라이브러리이다.

먼저 누락값을 사용하기 위해 numpy에서 누락값을 불러온다.

from numpy import NaN, NAN, nan

누락값은 말 그대로 데이터 자체가 없다는 것을 의미한다. 그래서 '같다'라는 개념도 없다. 다음은 누락값과 True, False, 0, ' '을 비교한 결과이다. 또한, 누락값은 값 자체가 없기 때문에 자기 자신과 비교해도 True가 아닌 False가 출력된다.

print(NaN == True)
print(NaN == False)
print(NaN == 0)
print(NaN == '')

print(NaN == NaN)
print(NaN == nan)

판다스에서 누락값을 확인하는 메서드인 isnull 메서드로 누락값을 검사한다.
import pandas as pd 

print(pd.isnull(NaN))
print(pd.isnull(nan))

print(pd.notnull(NaN))
print(pd.notnull(42))


※ 누락값의 갯수 구하기

1. count 메서드로 누락값이 아닌 값의 갯수 구하기

ebola = pd.read_csv('../data/country_timeseries.csv')
print(ebola.count())

2. shape[0]에 전체 행의 데이터 갯수가 저장되어 있다는 점을 이용하여 shape[0]에서 누락값이 아닌 값의 갯수를 빼면 누락값의 갯수를 구할 수 있다.

num_rows = ebola.shape[0]
num_missing = num_rows - ebola.count()
print(num_missing)

3. count_nonzero, isnull 메서드를 조합해도 누락값의 갯수를 구할 수 있다.

count_nonzero 메서드는 배열에서 0이 아닌 값의 갯수를 세는 메서드이다.
import numpy as np

print(np.count_nonzero(ebola.isnull()))
print(np.count_nonzero(ebola['Cases_Guinea'].isnull()))

4. 시리즈에 포함된 value_counts 메서드는 지정한 열의 빈도를 구하는 메서드이다. value_counts 메서드를 사용해 Cases_Guinea 열의 누락값 갯수를 구한다.

dropna = False 옵션(default는 True)을 주면 누락값(NaN)의 갯수를 카운트한다.
print(ebola.Cases_Guinea.value_counts(dropna = False).head())


※ 누락값 처리하기

1. 누락값 변경하기

데이터프레임에 포함된 fillna 메서드에 0을 대입하면 누락값을 0으로 변경한다.

fillna 메서드는 처리해야 하는 데이터프레임의 크기가 매우 크고 메모리를 효율적으로 사용해야 하는 경우에 자주 사용하는 메서드이다.

print(ebola.fillna(0).iloc[0:10, 0:5])

2. fillna 메서드의 method 인잣값을 ffill로 지정하면 누락값이 나타나기 전의 값으로 누락값이 변경된다. 예를 들어 6행의 누락값은 누락값이 나타나기 전의 5행의 값을 사용하여 누락값을 처리한다. 하지만 0, 1행은 처음부터 누락값이기 때문에 누락값이 그대로 남아있다.

print(ebola.fillna(method = 'ffill').iloc[0:10, 0:5])

3. method 인잣값을 bfill로 지정하면 누락값이 나타난 이후의 첫 번째 값으로 앞쪽의 누락값이 모두 변경된다. 하지만 이 방법도 마지막 값이 누락값인 경우에는 처리하지 못한다는 단점이 있다.

print(ebola.fillna(method = 'bfill').iloc[0:10, 0:5])

4. interpolate 메서드는 누락값 양쪽에 있는 값을 이용하여 중간값을 구한 다음 누락값을 처리한다. 이렇게 하면 데이터프레임이 일정한 간격을 유지하고 있는 것처럼 수정할 수 있다.

print(ebola.interpolate().iloc[0:10, 0:5])

5. 누락값 삭제하기

누락값이 필요 없을 경우에는 누락값을 삭제해도 된다. 하지만 누락값을 무작정 삭제하면 데이터가 너무 편향되거나 데이터의 갯수가 너무 적어질 수 있다. 그래서 누락값을 삭제할 때는 분석하는 사람이 잘 판단해야 한다.

누락값을 삭제하기 위해 dropna 메서드를 사용하였지만, 누락값이 포함된 행들이 모두 삭제되기 때문에 많은 데이터가 삭제된 것을 볼 수 있다.
ebola_dropna = ebola.dropna()
print(ebola_dropna.shape)

print(ebola_dropna)



※ 누락값이 포함된 데이터 계산하기

1. ebola 데이터프레임의 Guinea, Liberia, SierraLeone 열에는 누락값들이 존재한다. 누락값이 존재하는 열들을 가지고 ebola 발병 수의 합을 계산해본다.

ebola['Cases_multiple'] = ebola['Cases_Guinea'] + ebola['Cases_Liberia'] + ebola['Cases_SierraLeone']

ebola_subset = ebola.loc[:, ['Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone', 'Cases_multiple']] 
print(ebola_subset.head(n=10))
누락값이 하나라도 있는 행은 계산 결과(Cases_multiple)가 NaN이 되었음을 알 수 있다. 즉, 계산 결과 누락값이 더 많이 생겼다.

2. Cases_multiple 열을 sum 메서드를 사용해 더하면 세 지역의 ebola 발병 수의 합을 구할 수 있다. 이때 sum 메서드를 그냥 사용하면 누락값을 포함하여 계산한다. 따라서 결괏값도 누락값이 된다. 누락값을 무시한 채 계산하려면 skipna 인잣값을 True로 설정하면 된다.

print(ebola.Cases_Guinea.sum(skipna = True))

 

 

 

 

Reference

 
Do it! 데이터 분석을 위한 판다스 입문
저자 : 다니엘 첸
역자 : 김영하
출판 : 이지스퍼블리싱
발매 : 2018.10.11

 

반응형

댓글