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

9
以下是我使用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 函数,按照子产品分组,并将每周的值求和后输出到 .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个回答

9
你需要的工具是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

2
你可以传递axis=1到resample中,以避免双重转置。 - Jeff
谢谢!但是,如果我想要的数据是以周开始而不是以周结束呢?例如,日期列保持不变,但是在2012-11-11之下的所有数据将向左移动,以便在2012-11-04之下。 - jxn
1
阅读有关锚定偏移量的内容。也许'W-SAT'适合您(代替上面的'w')。 - Dan Allan
1
resample有新的语法。现在应该是:df.resample('w', axis=1).sum()。 - edge-case

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接