'std() 연산 시 NaN은 분석 대상 제외'에 해당되는 글 1건

  1. 2016.12.08 [Python pandas] 결측값 연산 (calculations with missing data)

지난번 포스팅에서는 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.ix[['b', 'e'], ['C1']] = None


In [7]: df.ix[['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

 

 

 

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

 

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

 

Posted by R Friend R_Friend