[Python pandas] DataFrame 결측값 여부 확인, 결측값 개수 : isnull(), notnull(), df.isnull().sum(), df.notnull().sum(), df.isnull().sum(1), df.notnull().sum(1)
Python 분석과 프로그래밍/Python 데이터 전처리 2016. 12. 7. 23:46DataFrame을 가지고 분석을 진행하다 보면 대부분의 경우 결측값(missing value)이 골치거리로 따라 다닙니다.
데이터가 원래 수집 혹은 측정이 안되었을 수도 있고, 다수의 DataFrame을 서로 병합하는 과정에서 결측값이 생길 수도 있으며, index를 재설정(reindex)하는 경우에도 결측값이 생길 수 있습니다.
이처럼 다양한 이유로 인해서 생기는 결측값은 분석 오류가 발생시키거나 혹은 왜곡시킬 위험이 있습니다. 따라서 분석할 DataFrame을 생성했으면 결측값(missing value)이 있는지 여부에 대해서 꼭 확인하고 조치하여야 합니다.
이번 포스팅에서는 Python pandas의 isnull(), notnull() 메소드를 활용해서 결측값이 있는지 여부를 확인하는 방법을 소개하겠습니다.
Python pandas에서는 결측값을 'NaN' 으로 표기하며, 'None'도 결측값으로 인식합니다.
먼저 결측값이 있는 DataFrame을 만들어보겠습니다.
# making DataFrame with missing values In [1]: import pandas as pd In [2]: from pandas import DataFrame In [3]: df_left = DataFrame({'KEY': ['K0', 'K1', 'K2', 'K3'], ...: 'A': ['A0', 'A1', 'A2', 'A3'], ...: 'B': [0.5, 2.2, 3.6, 0.4]}) In [4]: df_right = DataFrame({'KEY': ['K2', 'K3', 'K4', 'K5'], ...: 'C': ['C2', 'C3', 'C4', 'C5'], ...: 'D': ['D2', 'D3', 'D4', 'D5']}) In [5]: df_all = pd.merge(df_left, df_right, how='outer', on='KEY') In [6]: df_all Out[6]: A B KEY C D 0 A0 0.5 K0 NaN NaN 1 A1 2.2 K1 NaN NaN 2 A2 3.6 K2 C2 D2 3 A3 0.4 K3 C3 D3 4 NaN NaN K4 C4 D4 5 NaN NaN K5 C5 D5 |
(1) DataFrame 전체의 결측값 여부 확인 : df.isnull(), isnull(df), df.notnull(), notnull(df) |
isnull() 메소드는 관측치가 결측이면 True, 결측이 아니면 False의 boollean 값을 반환합니다.
notnull() 메소드는 관측치가 결측이면 False, 결측이 아니면 True를 반환합니다.(isnull() 과 정반대)
isnull(DataFrame) 과 DataFrame.isnull() 은 동일한 값을 반환하며, notnull(DataFrame)과 DataFrame.notnull() 역시 동일한 의미의 script 입니다.
In [7]: pd.isnull(df_all) Out[7]: A B KEY C D 0 False False False True True 1 False False False True True 2 False False False False False 3 False False False False False 4 True True False False False 5 True True False False False In [8]: df_all.isnull() Out[8]: A B KEY C D 0 False False False True True 1 False False False True True 2 False False False False False 3 False False False False False 4 True True False False False 5 True True False False False In [9]: pd.notnull(df_all) Out[9]: A B KEY C D 0 True True True False False 1 True True True False False 2 True True True True True 3 True True True True True 4 False False True True True 5 False False True True True In [10]: df_all.notnull() Out[10]: A B KEY C D 0 True True True False False 1 True True True False False 2 True True True True True 3 True True True True True 4 False False True True True 5 False False True True True |
(2) 특정 변수, 원소에 결측값 추가하기, 결측값 여부 확인하기 : indexing & None |
아래 예시의 'df_all' DataFrame 에서 ['A', 'B'] 칼럼의 ['0', '1'] index 위치에 있는 관측치에 'None'을 할당하여 결측치를 만들어보았습니다.
'A'칼럼의 경우 'string' 데이터 형식인데요, 'None'을 할당하니 'None'으로 입력되었습니다. 반면에, 'B' 칼럼의 경우 'float' 데이터 형식인데요, 'None'을 할당하니 'NaN'으로 자동으로 입력되었습니다.
DataFrame의 행, 열을 기준으로 indexing을 하고 싶을 때는 DataFrame.ix[[row1, row2], ['col1', 'col2']] 을 사용하면 됩니다. 아래 예시를 참고하세요.
In [11]: df_all Out[11]: A B KEY C D 0 A0 0.5 K0 NaN NaN 1 A1 2.2 K1 NaN NaN 2 A2 3.6 K2 C2 D2 3 A3 0.4 K3 C3 D3 4 NaN NaN K4 C4 D4 5 NaN NaN K5 C5 D5 In [12]: df_all.loc[[0, 1], ['A', 'B']] = None In [13]: df_all Out[13]: A B KEY C D 0 None NaN K0 NaN NaN 1 None NaN K1 NaN NaN 2 A2 3.6 K2 C2 D2 3 A3 0.4 K3 C3 D3 4 NaN NaN K4 C4 D4 5 NaN NaN K5 C5 D5 In [14]: df_all[['A', 'B']].isnull() Out[14]: A B 0 True True 1 True True 2 False False 3 False False 4 True True 5 True True |
(3) 칼럼별 결측값 개수 구하기 : df.isnull().sum() |
# counting missing value numbers for all columns In [15]: df_all.isnull().sum() Out[15]: A 2 B 2 KEY 0 C 2 D 2 dtype: int64 # counting missing value numbers for 'A' column In [16]: df_all['A'].isnull().sum() Out[16]: 2 |
반대로, 칼럼별 결측값이 아닌 값의 개수를 구하려면 df.notnull().sum() 을 사용하면 됩니다.
# counting notnull value numbers for all columns In [17]: df_all.notnull().sum() Out[17]: A 4 B 4 KEY 6 C 4 D 4 dtype: int64 |
(4) 행(row) 단위로 결측값 개수 구하기 : df.isnull().sum(1) 행(row) 단위로 실측값 개수 구하기 : df.notnull().sum(1) |
In [18]: df_all Out[18]: A B KEY C D 0 A0 0.5 K0 NaN NaN 1 A1 2.2 K1 NaN NaN 2 A2 3.6 K2 C2 D2 3 A3 0.4 K3 C3 D3 4 NaN NaN K4 C4 D4 5 NaN NaN K5 C5 D5 In [19]: df_all['NaN_cnt'] = df_all.isnull().sum(1) In [20]: df_all['NotNull_cnt'] = df_all.notnull().sum(1) In [21]: df_all Out[21]: A B KEY C D NaN_cnt NotNull_cnt 0 A0 0.5 K0 NaN NaN 2 4 1 A1 2.2 K1 NaN NaN 2 4 2 A2 3.6 K2 C2 D2 0 6 3 A3 0.4 K3 C3 D3 0 6 4 NaN NaN K4 C4 D4 2 4 5 NaN NaN K5 C5 D5 2 4 |
다음번 포스팅에서는 결측값 연산에 대해서 소개하겠습니다.