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

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

下面是我想要的输出,但它是在 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
4

1 回答 1

9

您需要的工具是resample,它在一段时间/频率上隐式使用 groupby 并应用平均值或总和等函数。

读取数据。

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

设置多索引。

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
于 2013-09-26T18:36:38.937 回答