2017-02-28 64 views
1

我有一個多指標數據幀:添加水平對多指標數據幀

iterables = [['bar', 'baz', 'foo', 'qux'], ['one', 'two']] 
Index = pd.MultiIndex.from_product(iterables, names=['first', 'second']) 
s = pd.DataFrame(np.random.randn(8,2), index=Index) 

它產生數據框如下:

     0   1 
first second      
bar one  0.619602 -0.422137 
     two -0.372906 0.581697 
baz one -0.968921 -0.014957 
     two -0.470649 -1.706410 
foo one  0.834609 -0.600675 
     two  0.005306 0.109989 
qux one -0.713642 -0.173100 
     two -1.155766 -0.365946 

現在,根據多指標的「第二」的水平,我想補充「三」,並使其等於「一」和「二」之差

在下面,A1將等於1.674156 - ( - 1.061293)

A2將等於-1.380391 - ( - 0.620890)

是這樣的:

     0   1 
first second      
bar one  1.674156 -1.380391 
     two -1.061293 -0.620890 
     three A1  A2 
baz one  0.839065 -1.985679 
     two -2.086971 -1.415384 
     three 
foo one -1.673192 -0.559783 
     two  0.135445 -1.101833 
     three 
qux one -0.605042 1.814256 
     two  0.182851 -1.819808 
     three 

我怎樣才能做到這一點? 我知道我可以摧毀level1,做diff,堆回來。 只是好奇任何更好的解決方案?

+0

如果我的回答對您有所幫助,歡迎隨時給予好評以及。非常感謝。謝謝 – piRSquared

回答

1

使用stack/unstack/assign

d = s.stack().unstack(1) 
d.assign(three=d.one - d.two).stack().unstack(1) 

        0   1 
first second      
bar one  0.877453 0.214777 
     two -0.741437 0.185339 
     three 1.618890 0.029437 
baz one  1.358314 -0.315129 
     two  1.881061 0.253034 
     three -0.522747 -0.568162 
foo one  1.663033 -0.879386 
     two -0.658539 -0.331162 
     three 2.321572 -0.548224 
qux one -0.171216 -0.510144 
     two  0.855199 -0.653881 
     three -1.026415 0.143737