2017-12-20 109 views
2

피벗 테이블에 부분합 행을 추가하려고합니다 (pandas pd.pivot_table 사용). 이것은 코드 table = pd.pivot_table(df, values= ['Quantity', 'Money', 'Cost'], index=['house','date', 'currency', 'family name'], columns=[], fill_value=0, aggfunc=np.sum)입니다.피벗 테이블 (팬다)의 부분합 행을 사용할 때 인덱스 섹션 (다른 열) 유지

enter image description here

그렇다면, I는 기준으로서 house를 사용하여 부분합 행 가려고 : 이것은 (Excel로)에 대응하는 출력이다. 나는이 링크 Pivot table subtotals in Pandas에 명시된 단계를 따랐으므로 tablesum = table.groupby(level='house').sum()을 사용하여 그룹을 만들었습니다. tabletablesum 데이터 프레임을 연결할 때까지 모든 것이 정상적으로 처리 된 것으로 보입니다. 이것은 내가 (가족 A에 대해) 무엇을 가지고 있습니다 :

enter image description here

기본적으로, 난 그냥 하나의 컬럼에 table's 인덱스 (집, 날짜, 통화, 가족의 이름)에 언급 된 네 가지 범주를 얻은 (쉼표로 구분). 그래서 집에서 소계를 얻을 때도 피벗 테이블 분리를 잃어 버렸습니다. 그래서, 내 질문입니다 : 어떻게 그것을 유지할 수 있습니다 (다른 컬럼에서 pivot_table의 인덱스를 mantaining)?

도움을 주시면 감사하겠습니다.

감사합니다,

PD : 나는이 링크 Sub Total in pandas pivot Table를 확인 그러나 이것은 나에게 문자열과 숫자에 관련 오류의 다른 유형을했다.

+0

가 일부를 제공 할 수있다 : 두 번째 수준 date도 다른 문자열 CONCAT 얻을 때문에 문자열로 변환 할 수있다 무슨 일이 일어나는지 보여주기 위해 데이터를 테스트합니까? –

+0

답변을 완전히 수정합니다. 확인해주세요. – jezrael

답변

1

사용자 정의 MultiIndex4와 수준을 생성하고 할당 할 수 있습니다.

주의 사항 :

TypeError: Cannot compare type 'Timestamp' with type 'str'

df = pd.DataFrame({'house':list('aaaaabbbbb'), 
        'date':['2015-01-01'] * 3 + ['2015-01-02'] * 2 + 
          ['2015-01-01'] * 3 +['2015-01-02'] * 2, 
        'currency':['USD'] * 3 + ['NK'] * 2 + ['USD'] * 3 +['NK'] * 2, 
        'Quantity':[1,3,5,7,1,0,7,2,3,9], 
        'Money':[5,3,6,9,2,4,7,2,3,9], 
        'Cost':[5,3,6,9,2,4,7,2,3,9], 
        'family name':list('aabbccaabb')}) 

print (df) 
    Cost Money Quantity currency  date family name house 
0  5  5   1  USD 2015-01-01   a  a 
1  3  3   3  USD 2015-01-01   a  a 
2  6  6   5  USD 2015-01-01   b  a 
3  9  9   7  NK 2015-01-02   b  a 
4  2  2   1  NK 2015-01-02   c  a 
5  4  4   0  USD 2015-01-01   c  b 
6  7  7   7  USD 2015-01-01   a  b 
7  2  2   2  USD 2015-01-01   a  b 
8  3  3   3  NK 2015-01-02   b  b 
9  9  9   9  NK 2015-01-02   b  b 

#convert only for subtotal - join with empty strings 
df['date'] = df['date'].astype(str) 

table = pd.pivot_table(df, values= ['Quantity', 'Money', 'Cost'], 
         index=['house','date', 'currency', 'family name'], 
         fill_value=0, 
         aggfunc=np.sum) 
print (table) 
             Cost Money Quantity 
house date  currency family name      
a  2015-01-01 USD  a    8  8   4 
          b    6  6   5 
     2015-01-02 NK  b    9  9   7 
          c    2  2   1 
b  2015-01-01 USD  a    9  9   9 
          c    4  4   0 
     2015-01-02 NK  b    12  12  12 

tablesum = table.groupby(level='house').sum() 

tablesum.index = pd.MultiIndex.from_arrays([tablesum.index.get_level_values(0)+ '_sum', 
              len(tablesum.index) * [''], 
              len(tablesum.index) * [''], 
              len(tablesum.index) * ['']]) 

print (tablesum) 
      Cost Money Quantity 
a_sum  25  25  17 
b_sum  25  25  21 

print (tablesum.index) 
MultiIndex(levels=[['a_sum', 'b_sum'], [''], [''], ['']], 
      labels=[[0, 1], [0, 0], [0, 0], [0, 0]]) 


df = pd.concat([table, tablesum]).sort_index(level=0) 
print (df) 
             Cost Money Quantity 
house date  currency family name      
a  2015-01-01 USD  a    8  8   4 
          b    6  6   5 
     2015-01-02 NK  b    9  9   7 
          c    2  2   1 
a_sum         25  25  17 
b  2015-01-01 USD  a    9  9   9 
          c    4  4   0 
     2015-01-02 NK  b    12  12  12 
b_sum         25  25  21 
+0

감사합니다! 이 점에 관해 다른 질문을하고 싶습니다. ** house ** '{'a ': 10,'b ': 100'}에 대한 사전을 만들었습니다. 지도를 사용하여 새 데이터 프레임 (df)에 링크 할 수 있습니까? 노력하고 있지만 오류가 나타납니다 : 'Key error house' – newbie