지난번 포스팅에서는 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
NaN  NaN
c  4.0  NaN
d  6.0  7.0
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
NaN  NaN
c  4.0  NaN
d  6.0  7.0
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
NaN  NaN
c  4.0  NaN
d  6.0  7.0
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
0.0  1.0   1.0
NaN  NaN   NaN
4.0  NaN   NaN
6.0  7.0  13.0
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
1.0 NaN NaN NaN
NaN NaN NaN NaN
5.0 NaN NaN NaN
7.0 NaN NaN NaN
NaN NaN NaN NaN


 

 

이상으로 결측값 연산을 마치도록 하겠습니다.

 

다음번 포스팅에서결측값 채우기, 결측값 대체 대해서 알아보겠습니다.

 

728x90
반응형
Posted by Rfriend
,