2017-04-05 94 views
2

的每個拉特假設我有以下的數據框添加小計:的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 

我想創建一個多指標,其中將包含每個拉特的總和。輸出將是這樣的:

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 

目前我使用的是循環創建每個級別上的三個不同dataframes,然後操縱它們在Excel中,如下圖所示。所以我想盡可能在​​python中進行這種計算。

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

非常感謝提前。

+0

我認爲在熊貓中沒有默認的做法。請注意,您可以使用'df.groupby(['a','b','c'])。sum()'來生成包含多級索引的組。但是,這是缺乏每個組的總數。你應該看看[這個問題](http://stackoverflow.com/questions/29413496/pandas-computing-total-sum-on-each-multiindex-sublevel)這是非常類似於你的問題。 –

回答

7

有了一些自由使用的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

太棒了! @piRSquared –

+0

@ScottBoston謝謝你:-) – piRSquared

+0

如何定義all_cols? –

0

您需要做兩個group by以獲得每個聚合級別的小計。然後將這些添加回最初的DF。這是一個related question