[Python pandas] 결측값 연산 (calculations with missing data)
Python 분석과 프로그래밍/Python 데이터 전처리 2016. 12. 8. 22:34지난번 포스팅에서는 Python pandas DataFrame 에서
- 결측값이 있는지 여부 확인 : isnull(), notnull()
- 열별 결측값 개수 : df.isnull().sum()
- 행별 결측값 개수 : df.isnull().sum(1)
확인하는 방법을 소개하였습니다. (바로가지 ☞ http://rfriend.tistory.com/260)
이번 포스팅에서는 결측값 연산 (calculations with missing data) 에 대해서 알아보겠습니다.
먼저, 필요한 모듈 importing 하고, 결측값 들어있는 DataFrame을 만들어보겠습니다.
In [1]: import pandas as pd In [2]: import numpy as np In [3]: from pandas import DataFrame In [4]: df = DataFrame(np.arange(10).reshape(5,2), ...: index=['a', 'b', 'c', 'd', 'e'], ...: columns=['C1', 'C2']) ...: In [5]: df Out[5]: C1 C2 a 0 1 b 2 3 c 4 5 d 6 7 e 8 9 In [6]: df.loc[['b', 'e'], ['C1']] = None In [7]: df.loc[['b', 'c'], ['C2']] = None In [8]: df Out[8]: C1 C2 a 0.0 1.0 b NaN NaN c 4.0 NaN d 6.0 7.0 e NaN 9.0 |
(1) sum(), cumsum() methods 계산 시 : NaN은 '0'으로 처리 |
# When summing data, NA (missing) values will be treated as zero In [9]: df.sum() # sum by columns Out[9]: C1 10.0 C2 17.0 dtype: float64 In [10]: df['C1'].sum() # sum of 'C1' column Out[10]: 10.0 In [11]: df['C1'].cumsum() # cumulative sum of 'C1' column Out[11]: a 0.0 b NaN c 4.0 d 10.0 e NaN Name: C1, dtype: float64 |
(2) mean(), std() 연산 시 : NaN은 분석 대상(population)에서 제외 |
In [8]: df Out[8]: C1 C2 a 0.0 1.0 b NaN NaN c 4.0 NaN d 6.0 7.0 e NaN 9.0 # As for mean(), std() methods, NA (missing) values will be ignored In [12]: df.mean() # mean by columns Out[12]: C1 3.333333 # (0+4+6)/3 = 3.333333 C2 5.666667 # (1+7+9)/3 = 5.66667 dtype: float64 In [13]: df.mean(1) # mean by row Out[13]: a 0.5 b NaN c 4.0 d 6.5 e 9.0 dtype: float64 In [14]: df.std() Out[14]: C1 3.055050 C2 4.163332 dtype: float64 |
(3) DataFrame 칼럼 간 연산 시 : NaN이 하나라도 있으면 NaN 반환 |
아래 예시의 'C3' 칼럼에서 'c', 'e' index 값을 유심히 보시기 바랍니다. '+'을 하는 'C1'과 'C2' 칼럼의 값 중에서 하나라도 NaN 이면 'C3' 값은 NaN 입니다. (물론 'C1'과 'C2' 모두 NaN이면 이들의 합인 'C3'는 NaN이구요.)
In [8]: df Out[8]: C1 C2 a 0.0 1.0 b NaN NaN c 4.0 NaN d 6.0 7.0 e NaN 9.0 In [15]: df['C3'] = df['C1'] + df['C2'] In [16]: df Out[16]: C1 C2 C3 a 0.0 1.0 1.0 b NaN NaN NaN c 4.0 NaN NaN d 6.0 7.0 13.0 e NaN 9.0 NaN |
(4) DataFrame 간 연산 : 동일한 칼럼끼리는 NaN을 '0'으로 처리하여 연산, 동일한 칼럼이 없는 경우(한쪽에만 칼럼이 있는 경우)는 모든 값을 NaN으로 반환 |
아래 예제의 df, df_2 의 두 개의 DataFrame에서는 'C1' 만이 동일한 (공통의) 칼럼이며, 나머지는 한쪽 DataFrame에만 있는 칼럼들로 구성이 되어 있습니다.
이들 df, df_2 두 개의 DataFrame을 '+' 하면 'C1' 만 제대로 덧셈 연산이 되고 ( NaN 은 '0'으로 처리하여 연산 ), 나머지 칼럼은 모든 값이 NaN으로 변환되었음을 알 수 있습니다.
In [17]: df_2 = DataFrame({'C1' : [1, 1, 1, 1, 1], ...: 'C4' : [1, 1, 1, 1, 1]}, ...: index=['a', 'b', 'c', 'd', 'e']) ...: In [18]: df Out[18]: C1 C2 C3 a 0.0 1.0 1.0 b NaN NaN NaN c 4.0 NaN NaN d 6.0 7.0 13.0 e NaN 9.0 NaN In [19]: df_2 Out[19]: C1 C4 a 1 1 b 1 1 c 1 1 d 1 1 e 1 1 In [20]: df + df_2 Out[20]: C1 C2 C3 C4 a 1.0 NaN NaN NaN b NaN NaN NaN NaN c 5.0 NaN NaN NaN d 7.0 NaN NaN NaN e NaN NaN NaN NaN |
이상으로 결측값 연산을 마치도록 하겠습니다.
다음번 포스팅에서는 결측값 채우기, 결측값 대체에 대해서 알아보겠습니다.