在Pandas中重新采样每个组的聚合

时间:2015-11-12 00:37:25

标签: python pandas

考虑如下的数据框

             ID         A           B        date
0    0C0003fi8E         6          10  2015-04-01
1    0C0AD3fi4S        10          15  2015-04-01
2    0C0AD3flmn        60          22  2015-04-01
3    0C0003fi8E        10          40  2015-04-02
4    0C0AD3fi4S         8          15  2015-04-02
5    0CaAD3flmn        33          18  2015-04-02
6    0C0003fi8E        10          19  2015-04-03
7    0C0AD3fi4S         8          25  2015-04-03
8    0CaAD3flmn        33          20  2015-04-03
9    0C0003fi8E        75          11  2015-04-04
10   0C0AD3fi4S         4          37  2015-04-04
11   0CaAD3flmn        28          80  2015-04-04
... 

我需要连续两天为每个 ID汇总AB

对于每A和每X天,结果应该是BID的一个值。

例如,在ID上使用每两天的采样频率:

             ID         A           B        date
     0C0003fi8E        16          50  2015-04-01
     0C0AD3fi4S        18          30  2015-04-01
     0C0AD3flmn        93          40  2015-04-01
     0C0003fi8E        95          30  2015-04-03
     0C0AD3fi4S        12          52  2015-04-03
     0CaAD3flmn        61         100  2015-04-03

我怎么能在熊猫中做到这一点?

如果我想使用更灵活的时间段重新采样,该怎么办?例如。每,或每resample可以用于此吗?

2 个答案:

答案 0 :(得分:3)

如果您将日期设置为索引,则可以使用TimeGrouper:

In [11]: df1.groupby(["ID", pd.TimeGrouper("d")]).sum()
Out[11]:
                        A   B
ID         date
0C0003fi8E 2015-04-01   6  10
           2015-04-02  10  40
           2015-04-03  10  19
           2015-04-04  75  11
0C0AD3fi4S 2015-04-01  10  15
           2015-04-02   8  15
           2015-04-03   8  25
           2015-04-04   4  37
0C0AD3flmn 2015-04-01  60  22
0CaAD3flmn 2015-04-02  33  18
           2015-04-03  33  20
           2015-04-04  28  80

In [12]: df1.groupby(["ID", pd.TimeGrouper("2d")]).sum()
Out[12]:
                        A    B
ID         date
0C0003fi8E 2015-04-01  16   50
           2015-04-03  85   30
0C0AD3fi4S 2015-04-01  18   30
           2015-04-03  12   62
0C0AD3flmn 2015-04-01  60   22
0CaAD3flmn 2015-04-01  33   18
           2015-04-03  61  100

注意:如有必要,您可以reset_index转换索引列。

这不是明确的文档,而是several examples in the cookbook

答案 1 :(得分:1)

您可以按照以下方式每周或每月轻松重新采样(每周显示):

>>> df.groupby(['date', 'ID']).sum().unstack().resample('1W').stack()
                               A          B
date       ID                              
2015-04-05 0C0003fi8E  25.250000  20.000000
           0C0AD3fi4S   7.500000  23.000000
           0C0AD3flmn  60.000000  22.000000
           0CaAD3flmn  31.333333  39.333333

关于您的初始请求,目前尚不清楚您希望如何处理日期中的差距。例如,您想要在连续的日历日或连续的每日观察中进行分组吗?

这是一种方法:

df2 = df.groupby(['date', 'ID']).sum().unstack('ID')
>>>  (df2.iloc[::2, :] + df2.iloc[1::2, :].values).stack('ID')
                        A    B
date       ID                 
2015-04-01 0C0003fi8E  16   50
           0C0AD3fi4S  18   30
2015-04-03 0C0003fi8E  85   30
           0C0AD3fi4S  12   62
           0CaAD3flmn  61  100