大熊猫中的动态聚合

时间:2018-06-04 07:57:04

标签: python pandas grouping aggregate pandas-groupby

我的原始数据框如下所示:

A           B   C
27/03/2018  u1  Yes 
28/03/2018  u2  Yes
02/04/2018  u2  No
04/04/2018  u1  Yes
05/04/2018  u1  No
10/04/2018  u2  Yes 
11/04/2018  u1  No
16/04/2018  u2  Yes
13/05/2018  u2  No

我希望得到一个新专栏:在每一行中,它会说明有多少"是"在实际日期的前7天内,B中的物品被发现。 因此,在这个例子中,它看起来像这样:

A           B   C    D
27/03/2018  u1  Yes  0
28/03/2018  u2  Yes  0
02/04/2018  u2  No   1
04/04/2018  u1  Yes  1
05/04/2018  u1  No   1
10/04/2018  u2  Yes  0
11/04/2018  u1  No   1
16/04/2018  u2  Yes  1
13/05/2018  u2  No   0

我想得到另一个专栏,但是在前30天内会做同样的事情。我想,弄清楚如何在7天内完成它会让其他人更容易。

P.S:我也想做同样的事情但是用实际的几周而不是前几天(因此,对于星期五01/06/2018,我们会考虑5月21日至27日这一周)。

如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

IIUC需要:

def f(x):
    d = x['A'] - pd.Timedelta(7, unit='d')
    a = (df.A.between(d, x.A) & (df.B == x.B) & (df.C == 'Yes'))
    #print (df[a])
    return a.sum()

df['new'] = df.apply(f, axis=1)
print (df)
           A   B    C  new
0 2018-03-27  u1  Yes    1
1 2018-03-28  u2  Yes    1
2 2018-02-04  u2   No    0
3 2018-04-04  u1  Yes    1
4 2018-05-04  u1   No    0
5 2018-10-04  u2  Yes    1
6 2018-11-04  u1   No    0
7 2018-04-16  u2  Yes    1
8 2018-05-13  u2   No    0

编辑:

week = df.A.dt.to_period('W')
df['start'] = week.apply(lambda r: r.start_time) - pd.Timedelta(7, unit='d')
df['end'] = week.apply(lambda r: r.end_time) + pd.Timedelta(1, unit='ns') - pd.Timedelta(8, unit='d')

def f(x):
    return (df.A.between(x.start, x.end) & (df.B == x.B) & (df.C == 'Yes')).sum()

df['new'] = df.apply(f, axis=1)
print (df)
           A   B    C      start        end  new
0 2018-03-27  u1  Yes 2018-03-19 2018-03-25    0
1 2018-03-28  u2  Yes 2018-03-19 2018-03-25    0
2 2018-02-04  u2   No 2018-01-22 2018-01-28    0
3 2018-04-04  u1  Yes 2018-03-26 2018-04-01    1
4 2018-05-04  u1   No 2018-04-23 2018-04-29    0
5 2018-10-04  u2  Yes 2018-09-24 2018-09-30    0
6 2018-11-04  u1   No 2018-10-22 2018-10-28    0
7 2018-04-16  u2  Yes 2018-04-09 2018-04-15    0
8 2018-05-13  u2   No 2018-04-30 2018-05-06    0