2017-07-25 198 views
3

我有以下的熊貓數據幀和基線值:大熊貓:重組DataFrames

df = pd.DataFrame(data=[ 
    {'yr': 2010, 'month': 0, 'name': 'Johnny', 'total': 50},, 
    {'yr': 2010, 'month': 0, 'name': 'Johnny', 'total': 50}, 
    {'yr': 2010, 'month': 1, 'name': 'Johnny', 'total': 105}, 
    {'yr': 2010, 'month': 0, 'name': 'Zack', 'total': 90} 
]) 
baseline_value = 100 

我分組和基於年份,月份和名稱彙總數據。然後,我計算相對淨總和基線值:

pt = pd.pivot_table(data=df, index=['yr', 'month', 'name'], values='total', aggfunc=np.sum) 
pt['net'] = pt['total'] - baseline_value 
print(pt) 
        total net 
yr month name 
2010 0  Johnny 100  0 
      Zack  90 -10 
     1  Johnny 105  5 

我如何重組該數據幀因此輸出看起來是這樣的:

       value 
yr month name type 
2010 0  Johnny Total 100 
         Net  0 
       Zack Total  90 
         Net  -10 
     1  Johnny Total 105 
         Net  5 

回答

2

選項1:重塑YOUT支點據幀:PT

使用stackrenameto_frame

pt.stack().rename('value').to_frame() 

輸出:採用​​和sum從原來的DF

這裏

      value 
yr month name    
2010 0  Johnny total 100 
        net  0 
      Zack total  90 
        net  -10 
    1  Johnny total 105 
        net  5 

選項2的另一種方法從源DF開始,使用​​和sumlevel參數,然後用stack重塑:

baseline_value = 100 
(df.set_index(['yr','month','name']) 
    .sum(level=[0,1,2]) 
    .eval('net = @baseline_value - total',inplace=False) 
    .stack() 
    .to_frame(name='value')) 

輸出:

      value 
yr month name    
2010 0  Johnny total 100 
        net  0 
      Zack total  90 
        net  10 
    1  Johnny total 105 
        net  -5 
+1

不錯!看起來像'pt.stack()。to_frame(name ='value')'也可以 –

+0

是的,我忘記了to_frame中的名稱參數。 –

+0

@ jcmetz21 ...使用'set_index'和'sum'以不同的方法更新答案。 –