2016-07-06 16 views
1

피벗 테이블로 변환해야하는 데이터 프레임이 있습니다. 문제 없어. Pandas는 피벗 테이블을 제공하지만 피벗 테이블을 만들 수는 있지만 Excel의 일부 기능은 복제 할 수 없습니다.groupby와 pivot_table에서 피벗 테이블이 Excel처럼 보이도록하는 방법

어느 것? 중반 방법 집계 (division_sac_ac에서 볼 수있는 총 금액)와 내가 3 (피벗, slice_ac, slice_sac) 오브젝트를 통합 할 수있는 방법

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

을 통해 얻은? 얻을 수있는

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

:

을 - :

편집 부분적인 결과 만 여전히 만족스럽지 (일반적으로 모두의 aestetichs 마일 떨어진 엑셀에서이다 부분 나는 slice_sac 통합 아니라 slice_ac 수 있기 때문에)

 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

당신은 할 수 (예 : 'subtotal'과 같은 자리 표시 자 값)을 집계 된 열의 인덱스 값으로 사용하여 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

관련 문제