2013-03-22 98 views
30

我用熊貓0.10.1熊貓透視錶行小計

考慮到這個數據幀:

Date  State City SalesToday SalesMTD SalesYTD 
20130320  stA ctA   20  400  1000 
20130320  stA ctB   30  500  1100 
20130320  stB ctC   10  500  900 
20130320  stB ctD   40  200  1300 
20130320  stC ctF   30  300  800 

怎麼能每狀態i組小計?

State City SalesToday SalesMTD SalesYTD 
    stA ALL   50  900  2100 
    stA ctA   20  400  1000 
    stA ctB   30  500  1100 

我試着用透視表,但我只能有小計列

table = pivot_table(df, values=['SalesToday', 'SalesMTD','SalesYTD'],\ 
        rows=['State','City'], aggfunc=np.sum, margins=True) 

我可以在Excel中實現這一點,與數據透視表。

回答

36

如果您將狀態和城市都放在行中,您將獲得單獨的邊距。重塑,你得到你後表:

In [10]: table = pivot_table(df, values=['SalesToday', 'SalesMTD','SalesYTD'],\ 
        rows=['State'], cols=['City'], aggfunc=np.sum, margins=True) 


In [11]: table.stack('City') 
Out[11]: 
      SalesMTD SalesToday SalesYTD 
State City         
stA All  900   50  2100 
     ctA  400   20  1000 
     ctB  500   30  1100 
stB All  700   50  2200 
     ctC  500   10  900 
     ctD  200   40  1300 
stC All  300   30  800 
     ctF  300   30  800 
All All  1900   130  5100 
     ctA  400   20  1000 
     ctB  500   30  1100 
     ctC  500   10  900 
     ctD  200   40  1300 
     ctF  300   30  800 

我承認這並不完全明顯。

+3

這個工作如果我們有值=,如果列是從列創建= ...將只有一個「全部」列。 – Winand 2015-05-29 10:31:47

18

您可以通過在State列上使用groupby()來獲取彙總值。

讓我們先作一些樣本數據:通過使用附加

dfsum = df.groupby('State', as_index=False).sum() 
dfsum['City'] = 'All' 

print dfsum 

    State SalesToday SalesMTD SalesYTD City 
0 stA   50  900  2100 All 
1 stB   50  700  2200 All 
2 stC   30  300  800 All 

我們可以在原始數據追加到總結DF:

import pandas as pd 
import StringIO 

incsv = StringIO.StringIO("""Date,State,City,SalesToday,SalesMTD,SalesYTD 
20130320,stA,ctA,20,400,1000 
20130320,stA,ctB,30,500,1100 
20130320,stB,ctC,10,500,900 
20130320,stB,ctD,40,200,1300 
20130320,stC,ctF,30,300,800""") 

df = pd.read_csv(incsv, index_col=['Date'], parse_dates=True) 

然後應用GROUPBY功能,並添加一列城市:

dfsum.append(df).set_index(['State','City']).sort_index() 

print dfsum 

      SalesMTD SalesToday SalesYTD 
State City         
stA All  900   50  2100 
     ctA  400   20  1000 
     ctB  500   30  1100 
stB All  700   50  2200 
     ctC  500   10  900 
     ctD  200   40  1300 
stC All  300   30  800 
     ctF  300   30  800 

我加入了set_index和sort_index使它看起來更像是你的榜樣輸出,它對於獲得結果並不是絕對必要的。

0

這個怎麼樣?

table = pd.pivot_table(data, index=['State'],columns = ['City'],values=['SalesToday', 'SalesMTD','SalesYTD'],\ 
         aggfunc=np.sum, margins=True) 

enter image description here

1

我覺得這個小計示例代碼是你想要的(類似於擅長小計)

我假設你按列A,B,C,d,比數要組è的列值

main_df.groupby(['A', 'B', 'C']).apply(lambda sub_df: sub_df\ 
     .pivot_table(index=['D'], values=['E'], aggfunc='count', margins=True) 

輸出:

A B C D E 
     a 1 
a a a b 2 
     c 2 
    all 5 
     a 3 
b b a b 2 
     c 2 
    all 7 
     a 3 
b b b b 6 
     c 2 
     d 3 
    all 14