>source

Pandas groupby에서 겹치지 않는 롤링 또는 슬라이딩 창을 만들고 싶습니다.

import pandas as pd
df1 = pd.DataFrame( {'a1':['A','A','B','B','B','B','B','B'],'a2':[1,1,1,2,2,2,2,2], 'b':[1,2,5,5,5,4,6,2]})

겹치는 롤링 윈도우의 경우 이렇게 할 수 있습니다.

df1.groupby(['a1','a2']).rolling(2).mean()

그러나 그것을 겹치지 않게 만드는 방법이 있습니까?

출력은 다음과 같아야합니다.

pd.DataFrame('a1':['A','B','B','B','B'],'a2':[1,1,2,2,2],'b':[1.5,NaN,5,5,NaN])

설명

언제 a1 이다 Aa2 이다 1 , b의 값은 12 . 두 결과를 모두 추가 1.5 .
언제 a1 이다 Ba2 이다 1 , 의 가치 b 이다 5 . 가치로 b 슬라이딩 윈도우의 길이보다 작습니다. NaN .
언제 a1 이다 Ba2 이다 2 , b의 값은 5,5,4,6,2 . 슬라이딩 윈도우는 2 , 그래서 추가 (5+5)/2=5 , (4+6)/2=5 . 마지막 값은 NaN 길이가 슬라이딩 윈도우보다 작기 때문입니다.


  • 답변 # 1

    글쎄요, 한 가지 접근 방식 (매우 우아하지는 않음)은 다음과 같습니다.

    def non_overlapping_mean(x, window=2):
        return x.groupby(np.arange(len(x)) // window).apply(lambda x: np.nan if len(x) < 2 else x.mean())
    
    res = df1.groupby(['a1', 'a2'])['b'].apply(non_overlapping_mean).droplevel(-1).reset_index()
    print(res)
    
    

    산출

     a1  a2    b
    0  A   1  1.5
    1  B   1  NaN
    2  B   2  5.0
    3  B   2  5.0
    4  B   2  NaN
    
    

    주요 아이디어는 연속적인 청크로 그룹화하는 것이며 여기에서 수행됩니다.

    x.groupby(np.arange(len(x)) // window)
    
    

  • 이전 javascript - localhost에서 간단한 채팅/저장 메시지를 어떻게 만들 수 있습니까?
  • 다음 reactjs - Google Analytics 측정 ID를 React JS와 통합