Python/Pandas Tutorial

[Python pandas] Fill time interval by group :: 비어있는 시간 채우고, group별 직전값으로 NA 채우기

슈퍼짱짱 2021. 7. 29. 15:49
반응형

공정 TAG 데이터를 처리하다보면, 데이터가 수집되지 않아, 비어있는 시간을 채워야 하는 경우가 있다.

특히, Group 별로 사이사이 비어있는 시간을 채우는 방법을 설명하고자 한다.

 

최종 결과는 다음과 같다.

 

DATE에 분 단위로 비어있는 row를 채우고, 그 값은 Group별 직전 시점의 값으로 채운다.

 

 

<채우기 전>

 

<채운 후>


1. Library

pandas와 numpy를 불러온다.

 

import pandas as pd
import numpy as np

 


 

2. Create Data

 

실습에 사용할 데이터를 만들어준다.

나중에 Group별로 직전값으로 채워주기 위해 A와 B로 이루어진 Group 컬럼과, 값을 나타내는 value, 시간을 나타내는 DATE로 만들었다.

 

data = pd.DataFrame({'Group':['A','B','A','A','B','B','B'],
                    'value':[1,2,np.nan, np.nan,3,np.nan,5],
                    'DATE':['2021-01-01 03:31:00', '2021-01-01 03:30:00', '2021-01-01 03:36:00',
                           '2021-01-01 03:38:00', '2021-01-01 03:31:00', '2021-01-01 03:33:00', 
                            '2021-01-01 03:39:00']})

 

만들어진 데이터는 다음과 같다.

 

 


3. DATE Type Change

 

Object형으로 만들어진 DATE를 pandas의 to_datetime()을 활용해 타입을 변경한다.

 

data.DATE = pd.to_datetime(data.DATE)

 


4. Fill Time and Fill NA by Group

 

이제 분 단위로 사이사이 없는 시간을 채워주고, 값은 Group별 직전 시간값으로 채우준다.

 

(data.groupby(["Group"])['DATE']
   .apply(lambda x:pd.date_range(start=x.min(), end=x.max(), freq="min"))
   .explode()
   .reset_index()
   .merge(data, how='left')
   .ffill()
)

 

groupby()로 그룹을 설정해주고, DATE에 대해 applyexplode로 사이사이 없는 시간(분)을 채워준다.

이렇게만 하면 value 컬럼 없이 Group과 DATE컬럼만 리턴되므로, 원래 data와 merge해주고, 비어있는 값을 ffill로 채워준다.

 

결과는 다음과 같다.

 

 

반응형