如何使用pandas按周分组数据透视表结果?

时间:2013-09-26 18:08:25

标签: python sql group-by pandas

以下是使用pandas pivot_table函数后以.csv格式输出的数据透视表的片段:

Sub-Product     11/1/12 11/2/12 11/3/12 11/4/12 11/5/12 11/6/12
GP  Acquisitions    164    168     54      72     203    167
GP  Applications    190    207     65      91     227    200
GPF Acquisitions    1124   1142    992    1053    1467   1198
GPF Applications    1391   1430   1269    1357    1855   1510

我现在唯一需要做的就是在pandas中使用groupby,在将每个Sub Product输出到.csv文件之前,按星期汇总每周的值。

以下是我想要的输出,但它是在Excel中完成的。第一列可能不完全相同,但我很好。我需要做的主要事情是按周分组,这样我就能得到按周计算的数据总和。 (查看顶行的日期如何按每7天分组一次)。希望能够使用python / pandas来做到这一点。有可能吗?

Row Labels   11/4/12 - 11/10/12       11/11/12 - 11/17/12
GP      
Acquisitions       926                        728
Applications       1092                       889
GPF     
Acquisitions       8206                       6425
Applications       10527                      8894

1 个答案:

答案 0 :(得分:7)

您需要的工具是resample,它会在一段时间/频率上隐式使用groupby,并应用像mean或sum这样的函数。

读取数据。

In [2]: df
Out[2]: 
      Sub-Product  11/1/12  11/2/12  11/3/12  11/4/12  11/5/12  11/6/12
GP   Acquisitions      164      168       54       72      203      167
GP   Applications      190      207       65       91      227      200
GPF  Acquisitions     1124     1142      992     1053     1467     1198
GPF  Applications     1391     1430     1269     1357     1855     1510

设置MultiIndex。

In [4]: df = df.reset_index().set_index(['index', 'Sub-Product'])

In [5]: df
Out[5]: 
                    11/1/12  11/2/12  11/3/12  11/4/12  11/5/12  11/6/12
index Sub-Product                                                       
GP    Acquisitions      164      168       54       72      203      167
      Applications      190      207       65       91      227      200
GPF   Acquisitions     1124     1142      992     1053     1467     1198
      Applications     1391     1430     1269     1357     1855     1510

将列解析为正确的日期时间。 (它们以字符串形式出现。)

In [6]: df.columns = pd.to_datetime(df.columns)

In [7]: df
Out[7]: 
                    2012-11-01  2012-11-02  2012-11-03  2012-11-04  \
index Sub-Product                                                    
GP    Acquisitions         164         168          54          72   
      Applications         190         207          65          91   
GPF   Acquisitions        1124        1142         992        1053   
      Applications        1391        1430        1269        1357   

                    2012-11-05  2012-11-06  
index Sub-Product                           
GP    Acquisitions         203         167  
      Applications         227         200  
GPF   Acquisitions        1467        1198  
      Applications        1855        1510  

每周(axis=1)重新取样('w'),按周汇总。 (how='sum'how=np.sum都是有效选项。)

In [10]: df.resample('w', how='sum', axis=1)
Out[10]: 
                    2012-11-04  2012-11-11
index Sub-Product                         
GP    Acquisitions         458         370
      Applications         553         427
GPF   Acquisitions        4311        2665
      Applications        5447        3365