'DataFrame 의 index 재설정 (reindex)'에 해당되는 글 1건

  1. 2016.11.27 [Python pandas] DataFrame의 index 재설정(reindex) 와 결측값 채우기(fill in missing values) (2)

지난번 포스팅에서는 DataFrame 의 행과 열 기준으로 데이터 선택해서 가져오기 (indexing and selection)에 대해서 알아보았습니다.

 

index를 처음 만들기는 했는데요, 필요에 따라서 수정해야 할 필요가 생길 수도 있겠지요?

 

이번 포스팅에서는

 

 - (1) index 재설정하기 (reindex)

 

 - (2) reindex 과정에서 생기는 결측값 채우기
       (fill in missing values)

 

방법에 대해서 소개하겠습니다.

 

 

먼저, 필요한 library를 import 하고, dit와 index를 사용해서 간5행, 2열을 가진 간단한 DataFrame을 만들어보겠습니다.

 

 

##-- Make a new index and reindex the dataframe

 

In [1]: import numpy as np

   ...: import pandas as pd

   ...: from pandas import DataFrame

 

In [2]: idx = ['r0', 'r1', 'r2', 'r3', 'r4']

   ...:

   ...: df_1 = pd.DataFrame({

   ...: 'c1': np.arange(5),

   ...: 'c2': np.random.randn(5)},

   ...: index=idx)

 

In [3]: df_1

Out[3]:

    c1        c2
r0   0  1.182716
r1   1  0.244398
r2   2 -1.494202
r3   3  0.146152
r4   4 -0.352680

 

 

 

 

위 예에서 df_1 DataFrame의 행 index 가 ['r0', 'r1', 'r2', 'r3', 'r4'] 인데요, ['r3', 'r4']를 빼고 ['r5', 'r6']를 새로 추가하고 싶다고 해봅시다.  이때 사용하는 것이 'reindex' 입니다.

 

 

  (1-1) index 재설정하기 : reindex

 

 

##-- Make a new index and reindex the dataframe

 

In [4]: new_idx= ['r0', 'r1', 'r2', 'r5', 'r6']


In [5]: df_1.reindex(new_idx)

Out[5]:

     c1        c2
r0  0.0  1.182716
r1  1.0  0.244398
r2  2.0 -1.494202
r5  NaN       NaN
r6  NaN       NaN

 

 

이전에 없던 ['r5', 'r6'] index가 추가되자 'NaN' 값이 디폴트로 채워쳤습니다.  'NaN' 대신에 fill_value 파라미터를 사용해서 '0', 혹은 'missing', 'NA' 등으로 바꿔서 채워보겠습니다.

 

 

 

  (1-2) reindex 과정에서 생긴 결측값 채우기 (fill in missing values) : fill_value

 

 

##-- Fill in the missing values by passing a value to the keyword fill_value

 

In [8]: df_1.reindex(new_idx, fill_value=0)

Out[8]:

    c1        c2
r0   0  1.182716
r1   1  0.244398
r2   2 -1.494202
r5   0  0.000000
r6   0  0.000000

 

 

 

 

In [9]: df_1.reindex(new_idx, fill_value='missing')

Out[9]:

         c1        c2
r0        0   1.18272
r1        1  0.244398
r2        2   -1.4942
r5  missing   missing
r6  missing   missing

 

 

 

In [10]: df_1.reindex(new_idx, fill_value='NA')
Out[10]:

    c1        c2
r0   0   1.18272
r1   1  0.244398
r2   2   -1.4942
r5  NA        NA
r6  NA        NA

 

 

 


 

시계열 데이터 (TimeSeries Data)는 DataFrame의 index 만들 때 pd.date_range(date, periods, freq) 를 사용합니다. (시계열 데이터 처리, 분석은 나중에 따로 많이 포스팅하겠습니다.)

 

먼저, 시계열 데이터로 DataFrame 만들어보겠습니다.

 

 

In [11]: date_idx = pd.date_range('11/27/2016', periods=5, freq='D')


In [12]: date_idx

Out[12]:

DatetimeIndex(['2016-11-27', '2016-11-28', '2016-11-29', '2016-11-30',

'2016-12-01'],

dtype='datetime64[ns]', freq='D')


In [13]: df_2 = pd.DataFrame({"c1": [10, 20, 30, 40, 50]}, index=date_idx)


In [14]: df_2

Out[14]:

                c1

2016-11-27 10

2016-11-28 20

2016-11-29 30

2016-11-30 40

2016-12-01 50

 

 

 

 

위에서 만든 시계열 데이터 DataFrame 의 date 앞/뒤로 reindex 를 사용해서 날짜 몇 개를 새로 추가해보겠습니다.

 

  (2-1) 시계열 데이터 index 재설정 하기 (reindex of TimeSeries Data)

 

 

In [15]: date_idx_2 = pd.date_range('11/25/2016', periods=10, freq='D')


In [16]: df_2.reindex(date_idx_2)

Out[16]:

                 c1

2016-11-25 NaN

2016-11-26 NaN

2016-11-27 10.0

2016-11-28 20.0

2016-11-29 30.0

2016-11-30 40.0

2016-12-01 50.0

2016-12-02 NaN

2016-12-03 NaN

2016-12-04 NaN

 

 

 

 

  (2-2) 시계열 데이터 reindex 과정에서 생긴 결측값 채우기 : method='ffill', 'bfill'
         (fill in missing value of TimeSeries Data)

 

reindex 하면서 결측값을 채우는 방법으로 method='ffill'을 사용해서 결측값 직전의 값으로 이후 결측값을 채워보겠습니다.

 

 

In [17]: df_2.reindex(date_idx_2, method='ffill') # forward-propagation

Out[17]:

                   c1
2016-11-25   NaN
2016-11-26   NaN
2016-11-27  10.0
2016-11-28  20.0
2016-11-29  30.0
2016-11-30  40.0
2016-12-01  50.0
2016-12-02  50.0
2016-12-03  50.0
2016-12-04  50.0

 

 

 

 

이번에는 reindex 하면서 method='bfill' 을 사용해서 시간 뒷 순서의 결측값으로 이전 결측값을 채워보겠습니다.  

 

 

In [18]: df_2.reindex(date_idx_2, method='bfill') # back-propagation

Out[18]:

                  c1
2016-11-25  10.0
2016-11-26  10.0
2016-11-27  10.0
2016-11-28  20.0
2016-11-29  30.0
2016-11-30  40.0
2016-12-01  50.0
2016-12-02   NaN
2016-12-03   NaN
2016-12-04   NaN

 

 

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

 

Posted by R Friend R_Friend