2016-07-06 38 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