[Python pandas] DataFrame의 index 재설정(reindex) 와 결측값 채우기(fill in missing values)
Python 분석과 프로그래밍/Python 데이터 전처리 2016. 11. 27. 21:39지난번 포스팅에서는 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
|
위 예에서 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
|
이전에 없던 ['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
|
In [9]: df_1.reindex(new_idx, fill_value='missing') Out[9]: c1 c2
|
In [10]: df_1.reindex(new_idx, fill_value='NA') c1 c2
|
시계열 데이터 (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' |
reindex 하면서 결측값을 채우는 방법으로 method='ffill'을 사용해서 결측값 직전의 값으로 이후 결측값을 채워보겠습니다.
In [17]: df_2.reindex(date_idx_2, method='ffill') # forward-propagation Out[17]: c1
|
이번에는 reindex 하면서 method='bfill' 을 사용해서 시간 뒷 순서의 결측값으로 이전 결측값을 채워보겠습니다.
In [18]: df_2.reindex(date_idx_2, method='bfill') # back-propagation Out[18]: c1
|
많은 도움 되었기를 바랍니다.
댓글을 달아 주세요
bfill과 ffill둘다 동시에 쓰고 싶은 경우에는 어떻게하나요?
분석 목적, 업의 특성에 따라 현업의 판단을 반영해서 무엇을 쓸지 결정하면 됩니다.
저는 보통 시계열데이터 분석할때 ffill 로 먼저 채우고, 데이터셋의 윗부분에 안채워자는 몇개 원소에 대해서는 bfill로 마저 채우는 식으로 해요.
ffill로 한번 돌리고,
그 다음줄에 bfill 로 한번 더 돌리면 됩니다.