[Pandas] DataFrame 시간 인덱스 나누기

반응형
    반응형

    판다스를 사용하다보면 내가 원하는만큼만 잘라서

    다시 DataFrame을 만들어서 데이터 분석을 하고 싶을 때가 있습니다.

    저는 특히 시간데이터를 많이 다루다 보니 인덱스 슬라이싱을 해야하는 경우가 많이 생기는 것 같습니다.

    그럴 때마다 항상 bool을 이용한 방식으로 인덱스 나누기를 했는데 인덱스가 여러개거나

    논리가 많아지면 괄호 하나 따라서 해석이 잘못 되기도 하고 헷갈리기도 합니다.

    그러면 자연스럽게 오류가 발생하고 오류를 해결하느라 애를 많이 먹고 시간은 시간대로 흘러갔습니다. 

    이런 불편함을 감수하던 차에 우연히 새로운 방법을 알게 되서 까먹으면 다시 보려고 포스팅으로 남깁니다.

     

    Bool 로 인덱스 나누기

    저의 예전 방법은 and, or을 이용한 방식이었는데 

    CJ제일제당의 과거 주가 데이터로 보여드리겠습니다.

     

     

    Date 를 인덱스로 설정했고 2014~2021년 1월까지의 데이터를 가져왔습니다. 

    여기서 2018~2019년의 데이터만 가지고 오고 싶어서 and(&)를 이용해 다음과 같이 코드를 만들었습니다.

     

    df_slice = df[('2018'<df.index)&(df.index<'2020')]
    df_slice

    코드를 실행하면 잘 나눠집니다. 

     

    pd.IndexSlice

    이번엔 판다스의 메소드중에 IndexSlice를 사용해보겠습니다.

    위 데이터와 동일하게 2018~2019년 데이터로 슬라이싱해보겠습니다.

     

    idx = pd.IndexSlice
    df_slice = df.loc[idx['2018':'2019'],:]
    df_slice

    마치 list나 np.array를 슬라이싱 하듯이 할 수 있습니다. 

     

    Column이 두개 이상일때

    원하는 Column도 가져올 수 있습니다.

    2018~2019년의 Close와 Volume만 가져오겠습니다.

     

    idx = pd.IndexSlice
    df_slice = df.loc[idx['2018':'2019'],['Close','Volume']]
    df_slice

    loc의 큰 틀을 깨지 않으면서 원하는 데이터를 가져올 수 있어서 굉장히 편합니다.

     

     

    Index가 두개 이상일 때

    MultiIndex에서도 간편하게 할 수 있습니다.

    개인적으로 bool을 이용하게 되면 오류가 많이 났던 부분인데 손쉽게 할 수 있어서 

    굉장히 좋았습니다.

     

    Date와 month를 인덱스로 갖는 DataFrame을 만들었습니다.

    MultiIndex라도 제가 원하는 데이터를 가져와야 합니다.

    그런데 IndexSlice를 사용하면 쉽게 가져올 수 있습니다.

    2018~2019년 데이터의 2월(February) 데이터를 가져오도록 하겠습니다.

     

    idx = pd.IndexSlice
    df_slice = df.loc[idx['2018':'2019','February'],:]
    df_slice

     

    loc 안에서 모든 코드가 끝났습니다.

    다들 어떠실지 모르겠지만

    제가 느끼기엔 bool을 이용하는 것보다 훨씬 간단한 것 같습니다.

     

    댓글

    Designed by JB FACTORY

    ....