我有以下数据框,例如
univ date ms kv
A 11/01/2007 1 0.2
A 11/02/2007 0 0.3
A 11/03/2007 1 0.4
A 11/05/2007 1 0.1
B 11/01/2007 0 0.11
B 11/03/2007 1 0.12
B 11/04/2007 1 0.13
对于每个univ组,我想计算ms = 1之后的下一个可用日期的kv的平均值。因此,在上述情况下,对于A,ms = 1在11/01和11/03和11 / 05所以输出应该是
univ kv
A 0.2 ( average of 0.3 and 0.1)
我还想让“下一个可用日期”变得灵活,它可能是“第二个下一个或第三个下一个可用日期”
非常感谢!
答案 0 :(得分:1)
IIUC:
DefaultServlet
In [244]: n=1
In [245]: df.groupby('univ') \
.apply(lambda x: x.loc[x.ms.shift(n)==1, 'kv'].mean()) \
.reset_index(name='kv')
Out[245]:
univ kv
0 A 0.20
1 B 0.13
答案 1 :(得分:1)
选项1
灵活...更改您开始切片x[n:]
df.query('ms == 1').groupby('univ').kv.apply(lambda x: x[1:].mean())
univ
A 0.25
B 0.13
Name: kv, dtype: float64
选项2
不灵活......只是乱搞这个
df[df.duplicated(['univ', 'ms'])] \
.query('ms == 1').set_index('univ').kv.mean(level=0)
univ
A 0.25
B 0.13
Name: kv, dtype: float64