pandas로 결측치 다루기

현업에서 다루는 데이터는 결측치(결측값)가 존재하는 경우가 많습니다. 우리는 파이썬의 판다스(pandas) 라이브러리를 사용하여 결측치를 다룰 수 있는데요, 이번 강의를 통하여 결측치를 다루는 방법에는 어떤 방법들이 있는지 살펴보겠습니다.


이 강의에서 사용되는 데이터는 구글 데이터셋 서치에서 제공하는 2020년 코로나 데이터입니다. 링크를 통해 페이지에 접속하신 후, 빨간색 사각형의 Download 버튼을 눌러 csv 데이터를 다운로드하실 수 있습니다. 코로나 데이터를 사용하여 아래와 같이 결측치 처리를 어떻게 할 수 있는지 공부를 진행해보겠습니다.

예제 데이터 살펴보기

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

판다스의 read_csv함수로 데이터를 불러온 뒤, head함수로 전체 데이터를 살펴보면 위와 같습니다. 칼럼은 행정구역, 국가/지역, 위도, 경도, 날짜, 확진자, 사망자, 회복자로 구성되어 있습니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

전체 데이터에는 여러 국가들의 데이터가 있지만, 실습은 우리나라 데이터로 실습을 진행하기 위하여 위와 같이 코딩합니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

이 포스팅에서 진행할 결측치 실습을 위해 위와 같이 데이터를 수정합니다.

결측치의 입력

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

결측치를 입력할 때에는 None도 가능하지만 np.nan, pd.NaT가 모두 가능합니다.

결측치의 확인

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

결측값을 확인하기 위하여 info 함수를 사용할 수 있습니다. 출력값의 중단을 살펴보면, 왼쪽부터 차례대로 칼럼명, 결측값이 아닌 데이터의 수, 데이터 타입을 나타내줍니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

isnull함수는 결측값을 True로, 결측값이 아닌 값을 False로 반환합니다. 그런데 이 때 각각의 값에 대하여 결측값 여부를 검사하기 때문에 sum함수를 덧붙여 사용하면 각 칼럼마다 결측치가 몇개 있는지 확인할 수 있습니다. (True는 1에 대응하고, False는 0에 대응하기 때문에 sum함수를 사용할 경우 결과값처럼 칼럼별 결측치 개수의 총합이 출력됩니다.)

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

notnull함수와 notna함수는 isnull함수와 반대로 작동합니다. 결측값을 False로, 결측값이 아닌 값을 True로 반환합니다. sum함수를 사용하여 컬럼별 결측값을 한 눈에 살펴볼 수 있습니다.


결측치 제거하기

dropna함수는 파이썬으로 프로그래밍할 때 결측치를 제거시에 유용하게 사용되는 함수입니다. dropna함수의 매개변수는 아래와 같습니다. (클릭시 dropna함수의 documentation으로 이동됩니다.)

DataFrame.dropna(selfaxis=0how='any'thresh=Nonesubset=Noneinplace=False)

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

dropna함수에 아무것도 넘겨주지 않을 때, 매개변수 axis의 default값이 0, how의 default값이 'any'이므로 결측값이 있는 행은 모두 삭제됩니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

how 매개변수는 axis 매개변수에 따라 결정된 행 혹은 열에 대하여 결측치가 하나라도 있으면 삭제할 것인지(any), 모든 값이 결측치여야 삭제할 것인지를(all) 결정합니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

dropna함수를 사용하여 결측치를 처리할 때 thresh 매개변수는 행(혹은 열)에 있는 결측치가 아닌 데이터의 개수의 기준을 설정할 수 있습니다. 위의 예제는 코딩에 따라 결측치가 아닌 데이터가 1개 이상이어야 하므로, 행의 모든 데이터가 결측치인 마지막 행이 삭제된 것을 확인할 수 있습니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

subset은 입력된 칼럼을 기준으로 결측치를 처리합니다. 행정구역 칼럼을 기준으로 dropna함수를 실행할 경우, 행정구역 칼럼에서 첫 번째 데이터가 '서울'이고 나머지 데이터가 모두 결측치 이므로 첫 번째 행만 남겨두고 결측치가 있는 다른 행은 모두 제거된 것을 확인할 수 있습니다. 마찬가지로 국가/지역 칼럼을 기준으로 dropna를 할 경우 대한민국 데이터가 있는 행을 제외한 모든 행이 제거된 것을 확인할 수 있습니다.

결측치 대체하기

DataFrame.fillna(selfvalue=Nonemethod=Noneaxis=Noneinplace=Falselimit=Nonedowncast=None)

fillna함수는 결측치를 대체하기 위해 사용됩니다. fillna함수에 사용되는 매개변수는 위와 같습니다. (클릭시 fillna함수의 documentation으로 이동됩니다.)

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

기본적으로 fillna함수에 값을 넘겨주면 해당 값으로 데이터프레임의 모든 결측치가 대체됩니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

결측치를 대체할 때에는 우리가 원하는 값으로 대체할 수 있습니다. 위 코드에서는 평균값으로 대체하였지만, 이외에도 최소값, 최대값, 분산, 표준편차 등 우리가 원하는 값을 위 코드처럼 유연하게 입력하여 대체할 수 있습니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

딕셔너리로 칼럼명과 데이터를 넘겨주면 해당 칼럼의 결측치가 데이터로 변경됩니다.

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

method 매개변수는 앞의 데이터로 뒤의 결측치를 대체하는 ffill,pad이 있고, 뒤의 데이터로 앞의 결측치를 대체하는 backfill,bfill가 있습니다. 보통의 경우, ffill을 사용하여 결측치를 처리합니다.

결측치 대체 실습

powered by Advanced iFrame free. Get the Pro version on CodeCanyon.

제공된 데이터에 이제까지 배운 내용을 사용하여 결측치를 대체할 수 있습니다. 몇몇의 칼럼에 딕셔너리를 사용하여 기존 결측치를 대체한 후, method 매개변수에 'ffill'을 입력하여 나머지 칼럼의 결측치를 처리할 수 있습니다.

Leave a Comment