2016-07-06 75 views
1

我有這個數據幀,我必須變成一個數據透視表。沒問題。熊貓提供的pivot/pivot_table允許創建漂亮的數據透視表,但有一些Excel的功能我似乎無法複製。如何熊貓groupby和pivot_table有pivotto表看起來像Excel的

哪些?骨料中途(在division_sac_ac看到的總金額),並通過

slice_ac = df.groupby(by='ac').sum() 
slice_sac = df.groupby(by='sac').sum() 

得到我該如何整合3(支點,slice_ac,slice_sac)對象?

編輯:部分結果,但仍然不能令人滿意(部分是因爲我可以集成slice_sac但不slice_ac - 而且通常它的所有aestetichs是從Excel英里遠):

table_df = pd.pivot_table(df, index=['ac','sac'], values='value', columns=['name'], aggfunc=[np.sum], margins=True) 
print(table_df.stack(['name'])) 

這將產生:

     sum 
ac  sac name   
bond Corp omega 0.05 
       All  0.05 
     Govt lambda 0.05 
       rho  0.20 
       All  0.25 
equity Europe alfa  0.05 
       beta  0.05 
       gamma 0.10 
       All  0.20 
     US  epsilon 0.20 
       All  0.20 
All   alfa  0.05 
       beta  0.05 
       epsilon 0.20 
       gamma 0.10 
       lambda 0.05 
       omega 0.05 
       rho  0.20 
       All  0.70 

實施例:

import pandas as pd 
import numpy as np 

division_sac_ac = {'equity': ['Europe', 'US'], 'bond': ['Corp', 'Govt']} 

df = pd.DataFrame.from_dict({'record_1': ['alfa', 'Europe', 'equity', 0.05], 
'record_2': ['beta', 'Europe', 'equity', 0.05], 
'record_3': ['gamma', 'Europe', 'equity', 0.1], 
'record_4': ['epsilon', 'US', 'equity', 0.2], 
'record_5': ['rho', 'Govt', 'bond', 0.2], 
'record_6': ['lambda', 'Govt', 'bond', 0.05], 
'record_7': ['omega', 'Corp', 'bond', 0.05], }, orient='index') 

df.columns = ['name', 'sac', 'ac', 'value'] 

table_df = pd.pivot_table(df, index=['ac','sac','name'], values='value', aggfunc=[np.sum]) 

slice_ac = df.groupby(by='ac').sum() 
slice_sac = df.groupby(by='sac').sum() 

print(table_df) 
print(slice_ac) 
print(slice_sac) 

table_df做的工作,但我想還集成中途結果(slice_ac, slice_sac)如本圖片: enter image description here

,而我的輸出更像是:

     sum 
ac  sac name   
bond Corp omega 0.05 
     Govt lambda 0.05 
       rho  0.20 
equity Europe alfa  0.05 
       beta  0.05 
       gamma 0.10 
     US  epsilon 0.20 
     value 
ac   
bond  0.3 
equity 0.4 
     value 
sac   
Corp  0.05 
Europe 0.20 
Govt  0.25 
US  0.20 

回答

1

你可以連接table_df,slice_ac & slice_sac通過將空值(或「小計」之類的佔位符值)作爲聚合列的索引值,例如

slice_ac = table_df.groupby(level=0).sum() 
slice_sac = table_df.groupby(level=[0, 1]).sum() 

slice_ac.index = pd.MultiIndex.from_tuples([(i, '', '') for i in slice_ac.index]) 
slice_sac.index = pd.MultiIndex.from_tuples([(i, j, '') for i, j in slice_sac.index]) 

pd.concat([table_df, slice_ac, slice_sac]).sort() 

將輸出

     sum 
ac  sac name 
bond     0.30 
     Corp   0.05 
       omega 0.05 
     Govt   0.25 
       lambda 0.05 
       rho  0.20 
equity     0.40 
     Europe   0.20 
       alfa  0.05 
       beta  0.05 
       gamma 0.10 
     US    0.20 
       epsilon 0.20 
+0

優秀!謝謝 – Asher11