복붙노트

[PYTHON] Python (팬더) 멀티 인덱스 데이터 프레임의 각 레벨에 부분합 추가

PYTHON

Python (팬더) 멀티 인덱스 데이터 프레임의 각 레벨에 부분합 추가

다음 데이터 프레임이 있다고 가정합니다.

a       b       c      Sce1     Sce2    Sce3    Sce4    Sce5    Sc6
Animal  Ground  Dog    0.0      0.9     0.5     0.0     0.3     0.4  
Animal  Ground  Cat    0.6      0.5     0.3     0.5     1.0     0.2 
Animal  Air     Eagle  1.0      0.1     0.1     0.6     0.9     0.1 
Animal  Air     Owl    0.3      0.1     0.5     0.3     0.5     0.9     
Object  Metal   Car    0.3      0.3     0.8     0.6     0.5     0.6 
Object  Metal   Bike   0.5      0.1     0.4     0.7     0.4     0.2 
Object  Wood    Chair  0.9      0.6     0.1     0.9     0.2     0.8 
Object  Wood    Table  0.9      0.6     0.6     0.1     0.9     0.7 

각 lvl의 합계를 포함하는 MultiIndex를 만들고 싶습니다. 결과는 다음과 같습니다.

a      b      c     Sce1    Sce2    Sce3    Sce4    Sce5    Sce6
Animal              1.9     1.6     1.4     1.3     2.7     1.6 
       Ground       0.6     1.4     0.8     0.5     1.3     0.6 
              Dog   0.0     0.9     0.5     0.0     0.3     0.4 
              Cat   0.6     0.5     0.3     0.5     1.0     0.2 
       Air          1.3     0.2     0.7     0.8     1.4     1.0 
              Eagle 1.0     0.1     0.1     0.6     0.9     0.1 
              Owl   0.3     0.1     0.5     0.3     0.5     0.9 
Object              2.6     1.6     1.8     2.3     2.0     2.3 
       Metal        0.8     0.3     1.1     1.3     0.9     0.8 
              Car   0.3     0.3     0.8     0.6     0.5     0.6 
              Bike  0.5     0.1     0.4     0.7     0.4     0.2 
       Wood         1.8     1.3     0.6     1.0     1.1     1.5 
              Chair 0.9     0.6     0.1     0.9     0.2     0.8 
              Table 0.9     0.6     0.6     0.1     0.9     0.7 

지금은 루프를 사용하여 각 레벨에서 세 가지 다른 데이터 프레임을 만든 다음 아래 에서처럼 Excel에서이를 조작합니다. 그래서 가능하면 파이썬으로이 계산을하고 싶었습니다.

for i in range range(0,3):
    df = df.groupby(list(df.columns)[0:lvl], as_index=False).sum()
    return df

미리 감사드립니다.

해결법

  1. ==============================

    1.MAGIC의 자유로운 사용

    MAGIC의 자유로운 사용

    pd.concat([
            df.assign(
                **{x: 'Total' for x in 'abc'[i:]}
            ).groupby(list('abc')).sum() for i in range(4)
        ]).sort_index()
    
                         Sce1  Sce2  Sce3  Sce4  Sce5  Sc6
    a      b      c                                       
    Animal Air    Eagle   1.0   0.1   0.1   0.6   0.9  0.1
                  Owl     0.3   0.1   0.5   0.3   0.5  0.9
                  Total   1.3   0.2   0.6   0.9   1.4  1.0
           Ground Cat     0.6   0.5   0.3   0.5   1.0  0.2
                  Dog     0.0   0.9   0.5   0.0   0.3  0.4
                  Total   0.6   1.4   0.8   0.5   1.3  0.6
           Total  Total   1.9   1.6   1.4   1.4   2.7  1.6
    Object Metal  Bike    0.5   0.1   0.4   0.7   0.4  0.2
                  Car     0.3   0.3   0.8   0.6   0.5  0.6
                  Total   0.8   0.4   1.2   1.3   0.9  0.8
           Total  Total   2.6   1.6   1.9   2.3   2.0  2.3
           Wood   Chair   0.9   0.6   0.1   0.9   0.2  0.8
                  Table   0.9   0.6   0.6   0.1   0.9  0.7
                  Total   1.8   1.2   0.7   1.0   1.1  1.5
    Total  Total  Total   4.5   3.2   3.3   3.7   4.7  3.9
    

    내가 네가 요구 한 것을 정확히 얻을 수있다.

    pd.concat([
            df.assign(
                **{x: '' for x in 'abc'[i:]}
            ).groupby(list('abc')).sum() for i in range(1, 4)
        ]).sort_index()
    
                         Sce1  Sce2  Sce3  Sce4  Sce5  Sc6
    a      b      c                                       
    Animal                1.9   1.6   1.4   1.4   2.7  1.6
           Air            1.3   0.2   0.6   0.9   1.4  1.0
                  Eagle   1.0   0.1   0.1   0.6   0.9  0.1
                  Owl     0.3   0.1   0.5   0.3   0.5  0.9
           Ground         0.6   1.4   0.8   0.5   1.3  0.6
                  Cat     0.6   0.5   0.3   0.5   1.0  0.2
                  Dog     0.0   0.9   0.5   0.0   0.3  0.4
    Object                2.6   1.6   1.9   2.3   2.0  2.3
           Metal          0.8   0.4   1.2   1.3   0.9  0.8
                  Bike    0.5   0.1   0.4   0.7   0.4  0.2
                  Car     0.3   0.3   0.8   0.6   0.5  0.6
           Wood           1.8   1.2   0.7   1.0   1.1  1.5
                  Chair   0.9   0.6   0.1   0.9   0.2  0.8
                  Table   0.9   0.6   0.6   0.1   0.9  0.7
    

    방법에 관해서는! 나는 그것을 독자를위한 운동으로 남겨 둘 것이다.

  2. ==============================

    2.당신은 집계의 모든 수준에서 부분합을 얻기 위해 두 그룹별로해야합니다. 그런 다음 초기 DF에 다시 추가하십시오. 여기에 관련된 질문이 있습니다.

    당신은 집계의 모든 수준에서 부분합을 얻기 위해 두 그룹별로해야합니다. 그런 다음 초기 DF에 다시 추가하십시오. 여기에 관련된 질문이 있습니다.

  3. from https://stackoverflow.com/questions/43238183/python-pandas-add-subtotal-on-each-lvl-of-multiindex-dataframe by cc-by-sa and MIT license