12 MissingValue

Missing Data

  • Pandas에는 Database에서 Null과 유사한 NaN이 존재함.

    • NaN은 Not a number라는 의미로, numpy에서의 개념이지만
    • Pandas에서는 존재할 수도 있지만 측정이 되지 않는 값임(not present for whatever reason missing value)
    • pandas에서는 NaN을 숫자형에 가깝게 인식함, 참고로 oracle의 경우 컬럼에 null이 있으면 숫자형으로 정의할 수 있음.
    • ' ' 이 Null에 더 가까운 개념임.
  • NaN을 조회하는 메소드로는

    • isnull(), notnull()
    • isnull().values.any()
  • NaN을 처리하는 메소드로는
    • dropna(), fillna()
In [1]:
import pandas as pd
import numpy as np
#pandas를 사용하기 위해서 import함 

data = [[ 0, 1,  2,  3]
       ,[ 4, 5,  6,  7]
       ,[ 8, 9, 10, 11]]

index = [2002, 2003, 2004 ]
columns =  ['Arizona','Boston', 'Chicago','Detroit']
df = pd.DataFrame(data = data, index = index, columns = columns)
## DataFrame()  안에 data, index, columns은 생략 가능함
print(df)
      Arizona  Boston  Chicago  Detroit
2002        0       1        2        3
2003        4       5        6        7
2004        8       9       10       11
In [2]:
# None을 사용해도 NaN으로 인식 
df.iloc[0,0] = np.NaN
df.iloc[0,1] = None
df
Out[2]:
ArizonaBostonChicagoDetroit
2002NaNNaN23
20034.05.067
20048.09.01011
In [3]:
# '' 로 할당 
df.iloc[1,2] = ''
df.iloc[1,3] = ''
df
Out[3]:
ArizonaBostonChicagoDetroit
2002NaNNaN23
20034.05.0
20048.09.01011
In [4]:
#NaN의 경우는 count하지 않음 , ''의  경우은 할당함
df.count()
Out[4]:
Arizona    2
Boston     2
Chicago    3
Detroit    3
dtype: int64
In [5]:
#NaN의 경우는 평균과 분산 값을 계산
print(df.mean())
df.std()
Arizona    6.0
Boston     7.0
dtype: float64
Out[5]:
Arizona    2.828427
Boston     2.828427
dtype: float64
In [6]:
# NaN으로 할당한 경우에는 숫자형이 었던 컬럼 타입이  변하지 않았지만 '' 로 변경된 타입은 숫자형이 Object 변경 되었음
df.dtypes
Out[6]:
Arizona    float64
Boston     float64
Chicago     object
Detroit     object
dtype: object
In [7]:
# isnull() 메소드를 사용하여 컬럼을 기준으로 조회할 수 있음
df[df['Arizona'].isnull()]
Out[7]:
ArizonaBostonChicagoDetroit
2002NaNNaN23
In [16]:
# notnull() 메소드를 사용하여 컬럼을 기준으로 조회할 수 있음
df[df['Arizona'].notnull()]
Out[16]:
ArizonaBostonChicagoDetroit
20034.05.0
20048.09.01011
In [9]:
# fillna메소드를 사용하여 NaN 값을 다른 값으로 대체할 수 있음
df.fillna(df.mean())
Out[9]:
ArizonaBostonChicagoDetroit
20026.07.023
20034.05.0
20048.09.01011
In [10]:
# dropna메소드를 NaN 값을 제거할 수 있음
df.dropna()
Out[10]:
ArizonaBostonChicagoDetroit
20034.05.0
20048.09.01011
In [11]:
# '' 값을 조회할 수 있는 방법
df.applymap(lambda x: x =='')
Out[11]:
ArizonaBostonChicagoDetroit
2002FalseFalseFalseFalse
2003FalseFalseTrueTrue
2004FalseFalseFalseFalse
In [12]:
#  컬럼 단위로 '' 값을 조회할 수 있는 방법
df[df['Detroit'].map(lambda x: x =='')]
Out[12]:
ArizonaBostonChicagoDetroit
20034.05.0
In [13]:
# replace 메소드로 '' 를 NaN으로 대체 할 수 있음
df.replace('',np.NaN)
Out[13]:
ArizonaBostonChicagoDetroit
2002NaNNaN2.03.0
20034.05.0NaNNaN
20048.09.010.011.0


© 2017. All rights reserved.

Powered by ZooFighter v0.12