지난번 포스팅에서는 Python pandas의 fillna() method를 사용한

 

 - 결측값 여부 확인하기

 - 결측값 채우기, 결측값 대체하기

 

에 대해서 알아보았습니다.

 

이번 포스팅에서는 Python pandas의 dropna() method를 사용해서

 

 - 결측값이 들어있는 행 전체 제거

   (delete row with missing values)

 - 결측값이 들어있는 열 전체를 제거

   (delete column with missing values)

 - 특정 행 또는 열 만을 대상으로 결측값이 들어있으면 제거

   (delete specific row or column with missing values)

 

하는 방법을 소개하겠습니다.

 

관측값이 아주 많고 결측값이 별로 없는 경우에는 결측값이 들어있는 행 전체를 삭제하고 분석을 진행해도 무리가 없고 편리할 수 있습니다.

 

혹은 특정 변수의 결측값 비율이 매우 높고, 결측값을 채워넣을 만한 마땅한 방법이 없는 경우에는 분석의 신뢰성 확보를 위해서 그 변수(행, 칼럼)을 삭제하고 분석을 진행할 필요도 있습니다.

 

이때 dropna() method 를 사용하면 됩니다.

 

 

 

 

먼저, 필요한 모듈을 불러오고, 결측값(None 또는 np.nan)이 들어있는 DataFrame을 만들어보겠습니다.

 

 

# importing modules

In [1]: import pandas as pd


In [2]: import numpy as np


In [3]: from pandas import DataFrame

 

# making DataFrame

In [4]: df = DataFrame(np.random.randn(5, 4),

   ...: columns=['C1', 'C2', 'C3', 'C4'])


In [5]: df

Out[5]:

         C1        C2        C3        C4
0 -0.336659 -0.738247  0.598380  0.727832
1 -0.900631  0.073079  1.182290 -0.138224
2 -1.521049 -1.422940  0.330948 -0.275343
3  0.554677 -0.530208 -0.397182  0.990026
4 -0.332384 -1.979684  0.560655  0.833487

 

# inserting missing values

In [6]: df.ix[[0,1], 'C1'] = None


In [7]: df.ix[2, 'C2'] = np.nan


In [8]: df

Out[8]:

         C1        C2        C3        C4
0       NaN -0.738247  0.598380  0.727832
1       NaN  0.073079  1.182290 -0.138224
2 -1.521049       NaN  0.330948 -0.275343
3  0.554677 -0.530208 -0.397182  0.990026
4 -0.332384 -1.979684  0.560655  0.833487

 

 

 

 

 

이제 dropna() method를 사용해서 결측값이 들어있는 행 전체(axis = 0) 삭제, 혹은 결측값이 들어있는 열 전체(axis=1) 삭제해 보겠습니다.

 

 

  (1) 결측값이 들어있는 행 전체 삭제하기(delete row with NaN) : df.dropna(axis=0)

 

 

# delete row with missing values

In [9]: df_dr

df_dop_row = df.dropna(axis=0)


In [10]: df_drop_row

Out[10]:

C1 C2 C3 C4

         C1        C2        C3        C4
3  0.554677 -0.530208 -0.397182  0.990026
4 -0.332384 -1.979684  0.560655  0.833487

 

 

 

 

  (2) 결측값이 들어있는 열 전체 삭제하기 (delete column with NaN) : df.dropna(axis=1)

 

 

In [8]: df

Out[8]:

         C1        C2        C3        C4
0       NaN -0.738247  0.598380  0.727832
1       NaN  0.073079  1.182290 -0.138224
2 -1.521049       NaN  0.330948 -0.275343
3  0.554677 -0.530208 -0.397182  0.990026
4 -0.332384 -1.979684  0.560655  0.833487

 

# delete column with missing values

In [11]: df_drop_column = df.dropna(axis=1)


In [12]: df_drop_column

Out[12]:

         C3        C4
0  0.598380  0.727832
1  1.182290 -0.138224
2  0.330948 -0.275343
3 -0.397182  0.990026
4  0.560655  0.833487

 

 

 

 

  (3) 특정 행 또는 열을 대상으로 결측값이 들어있으면 제거

       (delete specific row or column with missing values) : df[ ].dropna()

 

DataFrame의 행 또는 열을 indexing 한 후에 dropna() method를 적용하면 됩니다.  dropna() 와 dropna(axis=0)은 동일합니다 (즉, axis=0 은 생략 가능).

 

아래에 4가지의 예를 들어보았습니다.  원래의 df DataFrame을 어떻게 indexing 하느냐에 따라 결측값이 들어있는 행과 열이 제거되는지 유심히 살펴보시면 금방 이해가 될거예요.

 

 

In [8]: df

Out[8]:

         C1        C2        C3        C4
0       NaN -0.738247  0.598380  0.727832
1       NaN  0.073079  1.182290 -0.138224
2 -1.521049       NaN  0.330948 -0.275343
3  0.554677 -0.530208 -0.397182  0.990026
4 -0.332384 -1.979684  0.560655  0.833487

 

# delete specific column with missing values

In [13]: df['C1'].dropna()

Out[13]:

2   -1.521049
3    0.554677
4   -0.332384
Name: C1, dtype: float64


In [14]: df[['C1', 'C2', 'C3']].dropna() # the same with dropna(axis=0)

Out[14]:

         C1        C2        C3
3  0.554677 -0.530208 -0.397182
4 -0.332384 -1.979684  0.560655


In [15]: df[['C1', 'C2', 'C3']].dropna(axis=0) # by default, the same with dropna()

Out[15]:

         C1        C2        C3
3  0.554677 -0.530208 -0.397182
4 -0.332384 -1.979684  0.560655


In [16]: df[['C1', 'C2', 'C3']].dropna(axis=1)

Out[16]:

         C3
0  0.598380
1  1.182290
2  0.330948
3 -0.397182
4  0.560655

 

 

In [17]: df.ix[[2, 4], ['C1', 'C2', 'C3']].dropna(axis=0)

Out[17]:

         C1        C2        C3
4 -0.332384 -1.979684  0.560655

 

 

 

마지막으로 첨언하자면, 결측값이 들어있는 행 전체, 혹은 열 전체를 삭제하는 것은 데이터 소실, 혹은 데이터 모집단 왜곡의 위험도 있는 만큼 분석에 영향도를 한번 생각해보고 나서 결정하시면 좋겠습니다.

 

그리고 만약을 대비해서 원본 데이터 (source data)는 그대로 남겨 놓은 상태에서 행 삭제 혹은 열 삭제 후의 DataFrame은 다른 이름으로 copy 해서 사용하실 것을 권합니다. 

 

다음번 포스팅에서는 결측값 보간(interpolation)에 대해서 알아보겠습니다.

 

많은 도움 되었기를 바랍니다.

 

 

 

반응형
Posted by Rfriend

댓글을 달아 주세요