我有一个看起来像这样的数据集:
date id score
0 2016-04-01 A 1.0
1 2016-04-01 B 2.0
2 2016-04-02 C 1.0
3 2016-04-02 A 3.0
4 2016-04-03 B 4.5
5 2016-04-04 C 1.0
6 2016-04-05 A 2.0
7 2016-04-06 B 3.0
8 2016-04-06 C 6.0
我想计算按日期和乘积分组的最近N天(不包括今天)的平均值,因此对于n = 4,结果应如下所示:
date id mean_of_last_n_days
0 2016-04-01 A NaN
1 2016-04-01 B NaN
2 2016-04-02 C 0
3 2016-04-02 A 1.0
4 2016-04-03 B 2.0
5 2016-04-04 C 1.0
6 2016-04-05 A 2.0
7 2016-04-06 B 3.25
8 2016-04-06 C 1.0
有什么建议吗?
答案 0 :(得分:1)
您可以按id
分组并使用pd.shift
将所有值平移一个位置,因此当您再次按n
分组并采用特定窗口的滚动平均值时,只需最后n=4
df.score = df.groupby('id', sort=False).shift(1).score
df.groupby('id').rolling(f'{n} D', on = 'date').mean().reset_index()
id date score
0 A 2016-04-01 NaN
1 A 2016-04-02 1.00
2 A 2016-04-05 2.00
3 B 2016-04-01 NaN
4 B 2016-04-03 2.00
5 B 2016-04-06 3.25
6 C 2016-04-02 NaN
7 C 2016-04-04 1.00
8 C 2016-04-06 1.00
个元素考虑在内:
IEnumerator<Vector3> Positions()
{
for (int i = 0; i < _positions.Length / 3; ++i)
{
yield return new Vector3(_positions[3*i],
_positions[3*i+1],
_positions[3*i+2]);
}
}
答案 1 :(得分:1)
df.groupby('id').apply(lambda grp:
grp.rolling('5d', on = 'date', closed = 'left').agg('mean'))
>>>> df
date id score
0 2016-04-01 A NaN
1 2016-04-01 B NaN
2 2016-04-02 C NaN
3 2016-04-02 A 1.0
4 2016-04-03 B 2.0
5 2016-04-04 C 1.0
6 2016-04-05 A 2.0
7 2016-04-06 B 3.25
8 2016-04-06 C 1.0
您确定您的第一个“ C”应该为0吗?