pandas枢轴表行小计
我正在使用pandas0.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
我怎样才能将每个州的小计分组?
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)
我可以通过数据透视表来实现这个function。
如果你把状态和城市都放在行中,你会得到不同的边界。 重塑,你得到你后面的表格:
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
我承认这不是很明显。
您可以使用State列上的groupby()来获取汇总值。
让我们先做一些示例数据:
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 = 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
我们可以使用append将原始数据追加到总和df中:
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,使它看起来更像你的示例输出,它不是严格需要得到结果。
这个怎么样 ?
table = pd.pivot_table(data, index=['State'],columns = ['City'],values=['SalesToday', 'SalesMTD','SalesYTD'],\ aggfunc=np.sum, margins=True)
我认为这个小计示例代码是你想要的(类似于Excel小计)
我假设你想按列A,B,C,D来分组,比计算E的列值
main_df.groupby(['A', 'B', 'C']).apply(lambda sub_df: sub_df\ .pivot_table(index=['D'], values=['E'], aggfunc='count', margins=True)
输出:
ABCDE a 1 aaab 2 c 2 all 5 a 3 bbab 2 c 2 all 7 a 3 bbbb 6 c 2 d 3 all 14