본문 바로가기
데이터분석/머신러닝

[데이터 분석-전처리] 결측치 처리하는 방법

by code cleaner 2018. 4. 24.
반응형

데이터를 분석하면 가장 많은 시간을 데이터 전처리에 쏟게 된다


오늘은 결측치를 다루는 방법


예제:

import pandas as pd

from io import StringIO


csv_data = '''A,B,C,D,

1.,2.,3.,4.,

5.,6.,,8.,

0.0,11.0,12.0'''

df = pd.read_csv(StringIO(csv_data), encoding='UTF-8') #StringIO 은 데이터 프레임에 넣어주기 위해 사용


print(df) # 데이터 넣을 떄 ' '공란 주의하고, Unnamed: 4가 생긴 이유는 '/n' 때문에 생김


    A     B     C    D  Unnamed: 4 

0  1.0   2.0   3.0  4.0         NaN

1  5.0   6.0   NaN  8.0         NaN

2  0.0  11.0  12.0  NaN         NaN


df = df.drop(['Unnamed: 4'], axis=1)

print(df) # Unnamed: 4' 제거


    A     B     C    D

0  1.0   2.0   3.0  4.0

1  5.0   6.0   NaN  8.0

2  0.0  11.0  12.0  NaN


df_na = df.isnull() # isnull() 과 isna() 같음

print(df_na)


      A      B      C      D

0  False  False  False  False

1  False  False   True  False

2  False  False  False   True


df_na_sum = df.isnull().sum() # na 값의 갯수를 알려줌

print(df_na_sum)


A    0

B    0

C    1

D    1

dtype: int64


df_dropna = df.dropna() # Na값이 있는 모든 행 삭제

print(df_dropna)


    A    B    C    D

0  1.0  2.0  3.0  4.0



df_dropna = df.dropna(axis=1)  # Na값이 있는 모든 열 삭제

print(df_dropna)


    A     B

0  1.0   2.0

1  5.0   6.0

2  0.0  11.0


df_dropna = df.dropna(how='all') # 모든 행의 값이 Na 이면 행(기본값이 axis=0)을 삭제, (how='any') : 모든 행에서 Na값이 하나라도 있으면 행 삭제

print(df_dropna)


    A     B     C    D

0  1.0   2.0   3.0  4.0

1  5.0   6.0   NaN  8.0

2  0.0  11.0  12.0  NaN


df_dropna = df.dropna(thresh=4) # 

print(df_dropna)


    A    B    C    D

0  1.0  2.0  3.0  4.0


df_dropna = df.dropna(subset=['C']) # 컬럼 'C'에 결측치가 있는 경우 삭제

print(df_dropna)


    A     B     C    D

0  1.0   2.0   3.0  4.0

2  0.0  11.0  12.0  NaN


from sklearn.preprocessing import Imputer

imr = Imputer(missing_values='NaN', strategy='mean', axis=0) # 열의 평균을 결측값으로 대신 사용함

# Imputer 옵션: axis=0 : 열기준, axis=1 : 행기준 / strategy = 'mean' : 평균, 'median' : 중앙값, most_frequent: 최빈값/범주형 피처 값 조정에 유용함)

df_imr = imr.fit_transform(df.values)

print(df_imr)


[[ 1.   2.   3.   4. ]

 [ 5.   6.   7.5  8. ]

 [ 0.  11.  12.   6. ]]


df = df.fillna(value=100) # 특정 값으로 결측치를 채움

print(df)


    A     B      C      D

0  1.0   2.0    3.0    4.0

1  5.0   6.0  100.0    8.0

2  0.0  11.0   12.0  100.0


df.index = pd.date_range('20180401', periods=3) # 인덱스를 날자로 자동으로 넣어줌

print(df)


             A     B      C      D

2018-04-01  1.0   2.0    3.0    4.0

2018-04-02  5.0   6.0  100.0    8.0

2018-04-03  0.0  11.0   12.0  100.0


df = df.drop(pd.to_datetime('20180401')) # 특정 날짜의 데이터 행을 삭제함

print(df)


             A     B      C      D

2018-04-02  5.0   6.0  100.0    8.0

2018-04-03  0.0  11.0   12.0  100.0


반응형