Groupby MultiIndex 및 Pandas의 각 그룹에 내적 적용

Nov 18 2020

데이터 프레임 X가 있습니다.

>>> X
                    A                              B                    
                   x1        x2 intercept         x1        x2 intercept
Date                                                                    
2020-12-31  48.021395  2.406670         1 -11.538462  2.406670         1
2021-03-31  33.229490  2.410444         1 -23.636364  2.405720         1
2021-06-30  11.498812  2.419787         1 -32.727273  2.402403         1
2021-09-30   5.746014  2.583867         1 -34.000000  2.479682         1
2021-12-31   4.612371  2.739457         1 -39.130435  2.496616         1
2022-03-31   3.679404  2.766474         1 -40.476190  2.411736         1
2022-06-30   3.248155  2.771958         1 -45.945946  2.303280         1

및 시리즈 b :

>>> b
         
x1        -0.006
x2         0.083
intercept  0.017

그룹 A, B 각각의 내적을 b로 계산하고 결과를 하나의 데이터 프레임에 넣어야합니다. 다음과 같이 각 그룹을 명시 적으로 살펴볼 수 있습니다.

result = pd.concat(
    [X["A"].dot(b).rename("A"), X["B"].dot(b).rename("B"),], axis=1,
)

                   A         B
Date                          
2020-12-31 -0.071375  0.285984
2021-03-31  0.017690  0.358493
2021-06-30  0.148849  0.412763
2021-09-30  0.196985  0.426814
2021-12-31  0.216701  0.459002
2022-03-31  0.224541  0.460031
2022-06-30  0.227584  0.483848

그룹을 명시 적으로 반복하지 않고 동일한 결과를 얻을 수있는 방법이 있습니까? 특히 MultiIndex의 첫 번째 수준으로 먼저 그룹화 한 다음 각 그룹에 내적을 적용 할 수 있습니까? 예를 들면 :

result=X.groupby(level=[0], axis=1).apply(lambda x: x.dot(b))

이것은 나에게 ValueError: matrices are not aligned오류 를 줄 것입니다. 이것은 X의 그룹이 열에 두 가지 수준의 인덱스를 가지고 있지만 b의 인덱스는 단순한 인덱스라는 사실 때문이라고 생각합니다. 따라서 X에서 일치시키기 위해 b에 인덱스 수준을 추가해야합니까? 처럼:

result=X.groupby(level=[0], axis=1).apply(
    lambda x: x.dot(pd.concat([b], keys=[x.columns.get_level_values(0)[0]]))
)

이것으로 나는 얻는다 ValueError: cannot reindex from a duplicate axis. 나는 여기에 갇히고있다.

답변

jezrael Nov 18 2020 at 16:09

다음 DataFrame.droplevel을 사용 하여 최상위 수준 제거에 사용 rename:

f = lambda x: x.droplevel(0, axis=1).dot(b).rename(x.name)
result=df.groupby(level=0, axis=1).apply(f)
print (result)
                   A         B
2020-12-31 -0.071375  0.285984
2021-03-31  0.017690  0.358493
2021-06-30  0.148849  0.412763
2021-09-30  0.196985  0.426814
2021-12-31  0.216701  0.459002
2022-03-31  0.224541  0.460031
2022-06-30  0.227584  0.483848