2017-09-14 92 views
2

我有表如下表:添加列轉動與熊貓

import pandas as pd 
import numpy as np 

#simple table 
fazenda = [6010,6010,6010,6010] 
quadra = [1,1,2,2] 
talhao = [1,2,3,4] 
arTotal = [32.12,33.13,34.14,35.15] 
arCarr = [i/2 for i in arTotal] 
arProd = [i/2 for i in arTotal] 
varCan = ['RB1','RB2','RB3','RB4'] 
data = list(zip(fazenda,quadra,talhao,arTotal,arCarr,arProd,varCan)) 

#Pandas DataFrame 
df = pd.DataFrame(data=data,columns=['Fazenda','Quadra','Talhao','ArTotal','ArCarr','ArProd','Variedade']) 

#Pivot Table 
table = pd.pivot_table(df, values=['ArTotal','ArCarr','ArProd'],index=['Quadra','Talhao'], fill_value=0) 

print(table) 

造成這樣的:

   ArCarr ArProd ArTotal 
Quadra Talhao       
1  1  16.060 16.060 32.12 
     2  16.565 16.565 33.13 
2  3  17.070 17.070 34.14 
     4  17.575 17.575 35.15 

我需要兩個aditional的步驟:

  1. 添加小計和'ArTotal','ArCarr'和'ArProd'字段的總計總計
  2. 將'Variedade'字段添加到表

Wanted result

我嘗試添加列,但結果是不正確的。關於Total和Total Total的一些鏈接,我沒有得到滿意的結果。

我很難理解熊貓,我向更有經驗的同事尋求幫助。

+0

'table.groupby(水平= 0)的.sum()'是你所需要的。你可以將這些行刪除並粘貼到一個excel中。 –

+0

謝謝@cᴏʟᴅsᴘᴇᴇᴅ,但我需要用熊貓來做到這一點,最終目標是使用df.to_html() –

回答

2

獲得pivot右側第一個。

In [404]: values = ['ArTotal','ArCarr','ArProd'] 

In [405]: table = pd.pivot_table(df, values=values, index=['Quadra','Talhao','Variedade'], 
           fill_value=0).reset_index(level=-1) 

獲得總計

In [406]: Gt = table[values].sum() 

獲取Quadra水平總計

In [407]: St = table.sum(level='Quadra') 

使用append重塑table

In [408]: (table.append(
       St.assign(Talhao='Total').set_index('Talhao', append=True) 
       ).sort_index() 
       .append(pd.DataFrame([Gt.values], columns=Gt.index, 
            index=pd.MultiIndex.from_tuples([('Grand Total', '')], 
            names=['Quadra', 'Talhao'])) 
       ).fillna('')) 
Out[408]: 
        ArCarr ArProd ArTotal Variedade 
Quadra  Talhao 
1   1  16.060 16.060 32.12  RB1 
      2  16.565 16.565 33.13  RB2 
      Total 32.625 32.625 65.25 
2   3  17.070 17.070 34.14  RB3 
      4  17.575 17.575 35.15  RB4 
      Total 34.645 34.645 69.29 
Grand Total   67.270 67.270 134.54 

詳細

In [409]: table 
Out[409]: 
       Variedade ArCarr ArProd ArTotal 
Quadra Talhao 
1  1   RB1 16.060 16.060 32.12 
     2   RB2 16.565 16.565 33.13 
2  3   RB3 17.070 17.070 34.14 
     4   RB4 17.575 17.575 35.15 

In [410]: Gt 
Out[410]: 
ArTotal 134.54 
ArCarr  67.27 
ArProd  67.27 
dtype: float64 

In [411]: St 
Out[411]: 
     ArCarr ArProd ArTotal 
Quadra 
1  32.625 32.625 65.25 
2  34.645 34.645 69.29 
+0

和Variedade列從HTML中呈現PDF格式的結果。 – Dark

+0

這真的很不錯。 – Dark

+0

我採取了groupby方式,讓我知道你對我的解決方案的看法。 – Dark

1

我認爲約翰的解決方案我百思不得其解,但是根據當前的輸出,你不能做到這一點與數據透視表,你可以有一個系列產品採用分組數據的列表理解步驟,然後追加資金來做到這一點即

cols = ['Fazenda','Variedade','Quadra','Talhao'] 
ndf = pd.concat([i.append(i.drop(cols,1).sum(),1) for _,i in df.groupby('Quadra')]) 

ndf['Talhao'] = ndf[['Talhao']].fillna('Total') 
ndf['Quadra'] = ndf['Quadra'].ffill() 

new = ndf.set_index(['Quadra','Talhao']).drop(['Fazenda'],1) 

new = new.append(pd.DataFrame(df.sum()).T.drop(cols,1).set_index(pd.MultiIndex.from_tuples([('Grand Total', '')]))).fillna('') 

輸出:

 
        ArCarr ArProd ArTotal Variedade 
Quadra  Talhao         
1.0   1.0  16.060 16.060 32.12  RB1 
      2.0  16.565 16.565 33.13  RB2 
      Total 32.625 32.625 65.25   
2.0   3.0  17.070 17.070 34.14  RB3 
      4.0  17.575 17.575 35.15  RB4 
      Total 34.645 34.645 69.29   
Grand Total   67.270 67.270 134.54   
+0

感謝@Bharathshetty,與此列嘗試:'的cols = ['農場'法院'陰謀「的空氣。生產','Ár。 Carrier','Ár。總計「」品種「」日期種植‘ ’當前剪切「」最後剪切「」 TCH上一頁,‘估計’,‘TCH當前’,‘意見’]'我得到這個:ValueError異常:標籤[ 「品種」「種植日期」,「過去剪切」「觀察」]不包含在軸 –