Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 数据透视表行小计_Python_Pandas_Pivot Table - Fatal编程技术网

Python 数据透视表行小计

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

我用的是熊猫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
如何对每个州的小计进行分组

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)