[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
|
많은 도움 되었기를 바랍니다.
'Python 분석과 프로그래밍 > Python 데이터 전처리' 카테고리의 다른 글
[Python pandas] DataFrame과 Series 합치기 : pd.concat(), append() (3) | 2016.11.30 |
---|---|
[Python pandas] 여러개의 동일한 형태 DataFrame 합치기 : pd.concat() (2) | 2016.11.28 |
[Python pandas] DataFrame의 행 또는 열 데이터 선택해서 가져오기 (DataFrame objects indexing and selection) (2) | 2016.11.27 |
[Python pandas] pd.DataFrame 만들고 Attributes 조회하기 (0) | 2016.11.26 |
[Python pandas] DataFrame을 csv 파일로 내보내기 : df.to_csv() (11) | 2016.11.26 |