2016-04-24 13 views
-1

インデックス#1(Fruits and Animal)の小計行と列の小計カラム(2015と2016)を追加したいと思います。パンダの小計ピボットテーブルのインデックスとカラム

小計の列については、このようなことができますが、このタイプのコードを毎年実行するのは非効率的です(2015 & 2016)。より良い方法がありますか?私は、マージンは複数の小計があるので動作しないと思います。

df[('2015','2015_Total')] = df[('2015','1st')]+df[('2015','2nd')] 

小計の行(例:フルーツの合計と動物の合計)については、どこから始めるべきかわかりません。

enter image description here

+0

あなたがデータフレームを生成し、あなたが助けを必要とする時点件まで到達するためにコードの一部を追加することができることができ:sort_index(私は正しいソートの値の前にTotal_を追加)にあなたが持っている最後? – Abbas

答えて

1

あなたはcolumnsindexMultiindexを作成する必要があるので、それは、非常に複雑です。

groupbysumを使用すると、小計を簡単に作成できます。次に、Multiindexを作成し、最後にconcat新しい列をDataFrameに作成します。

print df 
       2015_____  2016_______  
        1st 2nd   1st 2nd 
Fruits Apple   10 9   11 10 
     Banana  20 22   21 20 
Animal Lion   5 3   2 1 
     Tiger   2 3   5 0 

df1 = df.groupby(level=0, axis=1).sum() 
print df1 
       2015_____ 2016_______ 
Fruits Apple   19   21 
     Banana   42   41 
Animal Lion   8   3 
     Tiger   5   5 

print df.columns.get_level_values(0).to_series().drop_duplicates().tolist() 
['2015_____', '2016_______'] 

#change index to multiindex 
new_columns = zip(df.columns.get_level_values(0).to_series().drop_duplicates().tolist(), 
        "Total_" + df1.columns.str[:4]) 
print new_columns 
[('2015_____', 'Total_2015'), ('2016_______', 'Total_2016')] 

df1.columns = pd.MultiIndex.from_tuples(new_columns) 
print df1 
       2015_____ 2016_______ 
       Total_2015 Total_2016 
Fruits Apple   19   21 
     Banana   42   41 
Animal Lion   8   3 
     Tiger   5   5 

df = pd.concat([df,df1], axis=1) 
df2 = df.groupby(level=0, sort=False).sum() 
print df2 
     2015_____  2016_______  2015_____ 2016_______ 
      1st 2nd   1st 2nd Total_2015 Total_2016 
Animal   7 6   7 1   13   8 
Fruits  30 31   32 30   61   62 

print df.index.levels[0][df.columns.labels[0]].to_series().drop_duplicates().tolist() 
['Animal', 'Fruits'] 

#change index to multiindex 
new_idx=zip(df.index.levels[0][df.columns.labels[0]].to_series().drop_duplicates().tolist(), 
      "Total_" + df2.index) 
print new_idx 
[('Animal', 'Total_Animal'), ('Fruits', 'Total_Fruits')] 

df2.index = pd.MultiIndex.from_tuples(new_idx) 
print df2 
        2015_____  2016_______  2015_____ 2016_______ 
          1st 2nd   1st 2nd Total_2015 Total_2016 
Animal Total_Animal   7 6   7 1   13   8 
Fruits Total_Fruits  30 31   32 30   61   62 

df = pd.concat([df,df2]) 
df = df.sort_index(axis=1).sort_index() 
print df 
        2015_____    2016_______    
          1st 2nd Total_2015   1st 2nd Total_2016 
Animal Lion     5 3   8   2 1   3 
     Tiger    2 3   5   5 0   5 
     Total_Animal   7 6   13   7 1   8 
Fruits Apple    10 9   19   11 10   21 
     Banana    20 22   42   21 20   41 
     Total_Fruits  30 31   61   32 30   62 
+0

ありがとう!!!!私はdf.columns.labels [0] ...をnew_idx = zip(df.index.levels [0] [df.columns.labels [0]]に含めるつもりはないと思いますか? –

+0

はい、私はあなたはそれもカラム用に使うことができると思います。リストの問題点の値が入れ替えられたので、このメソッドを使用しなければなりません。Btw、[ラベルもレベルを使用するソリューション](http://stackoverflow.com/questions/14189695/reset-index-for-dataframe-columns)。 – jezrael

関連する問題