Python 数据透视表行小计
我用的是熊猫0.10.1 考虑到此数据帧:Python 数据透视表行小计,python,pandas,pivot-table,Python,Pandas,Pivot Table,我用的是熊猫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
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)
我可以在excel上通过数据透视表实现这一点。您可以使用状态列上的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函数并添加一列City:
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_索引和sort_索引,使其看起来更像示例输出,而不是严格地获得结果。如果您不将State和City都放在行中,您将获得单独的页边距。重塑形状,您将得到您想要的桌子:
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
我承认这不是很明显 这个怎么样
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)
输出:
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
如果我们有值=,如果列是从列=。。。只有一个“全部”列。@wes mckinney对于pandas的0.25.1版,
行
不是参数。我指定了一个3列索引,但输出仅返回总计,而不返回索引列的小计。以防有人出现并尝试此操作,但忽略了margins=True
参数:需要获得添加了all
的行。@Parfait在您的示例中有没有包含总计的方法?@Clickinaway。。。这不是我的答案,我只是帮忙编辑。但根据规格,您可以得到行小计和列总计。@Parfait我目前做不到这一点,整个上午都在看其他SE文章。我的帖子在这里,我知道我们不应该感谢别人,也不应该赞美别人,但这是纯粹的天才。这解决了我的问题。非常感谢。另一个可选函数是concat(),它允许我通过设置参数ignore\u index对索引进行更多控制。pd.concat([x,y],忽略指数=True)。alse提到concat()比pandas.append()更有效。
table = pd.pivot_table(df, index=['A'], values=['B', 'C'], columns=['D', 'E'], fill_value='0', aggfunc=np.sum/'count'/etc., margins=True, margins_name='Total')
print(table)