我的原始数据框如下所示:
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日这一周)。如何实现这一目标?
答案 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