2016-04-08 10 views
1

Iインデックスと列の両方のために、マルチ・インデックスであり、次のピボットテーブルを有する:ここパイソンパンダピボットテーブル - マルチインデックス列に計算された列を追加

Category  HF      DA  
       tafp tap  tw  tafp tap  tafp 
ATTR EL      
attr1 1.0  10  25  15  100  150  50 
attr2 2.0  0  0  0  40  70  30 
     3.0  20  50  30  0  0  0 
attr3 2.0  0  0  0  0  0  0 

本の辞書ですピボットテーブル(値が少し異なっているが、それは問題ではありません):

{ 
('HF', 'tafp'): {('attr1', '1.0'): 10, ('attr2', '2.0'): 100, ('attr3','2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 71}, 
('HF', 'tap'): {('attr1', '1.0'): 30, ('attr2', '2.0'): 350, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 1042}, 
('HF', 'tw'): {('attr1', '1.0'): 20, ('attr2', '2.0'): 250, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 971}, 
('DA', 'tafp'): {('attr1', '1.0'): 0, ('attr2', '2.0'): 435, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 0}, 
('DA', 'tap'): {('attr1', '1.0'): 0, ('attr2', '2.0'): 635, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 0}, 
('DA', 'tw'): {('attr1', '1.0'): 0, ('attr2', '2.0'): 200, ('attr3', '2.0'): 0, ('attr4', '2.0'): 0, ('attr2', '3.0'): 0} 
} 

私が最後に取得したい何を、以下の通りです:

Category  HF      DA  
       tafp/tap tw  tafp/tap tafp 
ATTR EL      
attr1 1.0  0.67  15  0.67  50 
attr2 2.0  0   0  0.57  30 
     3.0  0.67  30  0   0 
attr3 2.0  0   0  0   0 

だから、tafp/tapのパーセンテージを取得し、この計算された列を保持する、つまり元の列を削除するだけです。

誰かが私がこれをどのように達成できるか考えていますか?

何か助けていただければ幸いです。

答えて

2

いくつかの手順では、

第1スタックレベル0 ('DA,HF')レベル1を扱いやすくするための列として使用します。('tafp','tap')

df=df.stack(level=0) 
""" 
       tafp tap tw 
attr1 1.0 DA  0  0 0 
      HF 10 30 20 
attr2 2.0 DA 435 635 200 
      HF 100 350 250 
     3.0 DA  0  0 0 
      HF 71 1042 971 
attr3 2.0 DA  0  0 0 
      HF  0  0 0 
attr4 2.0 DA  0  0 0 
      HF  0  0 0 
""" 

次に操作:

valid=df.tap>0 
df.tafp[valid] /= df.tap[valid] 

最後に再フォーマット:用

df=df.drop('tap',axis=1).unstack() 
df.reorder_levels([1,0],axis=1).sort_index(axis=1) 

""" 
       DA    HF  
       tafp tw  tafp tw 
attr1 1.0 0.000000 0 0.333333 20 
attr2 2.0 0.685039 200 0.285714 250 
     3.0 0.000000 0 0.068138 971 
attr3 2.0 0.000000 0 0.000000 0 
attr4 2.0 0.000000 0 0.000000 0 
""" 
+0

はどうもありがとうございました!魅力のように動作します。あなたはスタックとアンスタックの 'レベル'引数の使用を明確にすることができますか?私はそれが何を意味するのか理解していますが、どうしてスタックを解除するときにレベル= 2を使用しますか? –

+1

( 'HF'、 'DA')が行インデックスの3番目(インデックス2)の列になっているため、デフォルトであるため削除します。 –