2016-07-06 17 views
1

Ich habe diesen Datenrahmen, den ich in eine Pivot-Tabelle zu verwandeln. Kein Problem. Pandas bietet pivot/pivot_table an, die es erlauben, schöne Pivot-Tabellen zu erstellen, aber es gibt einige Features von Excel, die ich nicht zu replizieren glaube.Wie pandas groupby und pivot_table, um Pivto-Tabellen zu haben aussehen wie Excel

welche? die auf halbem Weg Aggregate (die in division_sac_ac gesehen Gesamtsummen) und

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

durch

erhalten Wie kann ich die 3 (Pivot, slice_ac, slice_sac) Objekte integrieren?

EDIT: Teiler, aber immer noch nicht zufrieden stellend (Teil weil ich slice_sac integrieren konnte aber nicht slice_ac - und in der Regel die aestetichs von allem ist Meilen von Excel entfernt):

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

, die ergeben:

     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 

Beispiel:

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 macht den Job, aber ich würde auch auf halbem Wege Ergebnisse (slice_ac, slice_sac) in diesem Bild gezeigt integrieren möchten: enter image description here

während meiner Ausgabe ist mehr wie:

     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 

Antwort

1

Sie könnten verketten table_df, slice_ac & slice_sac, indem Sie leere Werte (oder einen Platzhalterwert wie 'Zwischensumme') als Indexwert für die aggregierten Spalten verwenden, z

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() 

ausgeben wird

     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

ausgezeichnet! Danke – Asher11