如何使用Python创建一个新列,该列代表另一列的滚动平均值?

5

我有一个数据框:

import pandas as pd
import numpy as np
d1 = {'id': [11, 11,11,11,11,24,24,24,24,24,24], 
     'PT': [3, 3,6,0,9,4,2,3,4,5,0], 
      "date":["2010-10-10","2010-10-12","2010-10-16","2010-10-18","2010-10-22","2010-10-10","2010-10-11","2010-10-14","2010-10-16","2010-10-19","2010-10-22"], 
        }

df1 = pd.DataFrame(data=d1)

    id  PT  date
0   11  3   2010-10-10
1   11  3   2010-10-12
2   11  6   2010-10-16
3   11  0   2010-10-18
4   11  9   2010-10-22
5   24  4   2010-10-10
6   24  2   2010-10-11
7   24  3   2010-10-14
8   24  4   2010-10-16
9   24  5   2010-10-19
10  24  0   2010-10-22

我希望计算每个 id 的列 PT 在最后3个条目上移动窗口下的滚动均值。 此外,如果该 id 的条目数尚不足3个,则应获取最后2个或当前条目的平均值。 结果应如下所示:

id  PT  date    Rolling mean last 3
0   11  3   2010-10-10  3
1   11  3   2010-10-12  3
2   11  6   2010-10-16  4
3   11  0   2010-10-18  3
4   11  9   2010-10-22  5
5   24  4   2010-10-10  4
6   24  2   2010-10-11  3
7   24  3   2010-10-14  3
8   24  4   2010-10-16  3
9   24  5   2010-10-19  4
10  24  0   2010-10-22  3

我尝试并获得:

df1["rolling"]=df1.groupby('id')['PT'].rolling(3).mean().reset_index(0,drop=True)
    id  PT  date    rolling
0   11  3   2010-10-10  NaN
1   11  3   2010-10-12  NaN
2   11  6   2010-10-16  4.0
3   11  0   2010-10-18  3.0
4   11  9   2010-10-22  5.0
5   24  4   2010-10-10  NaN
6   24  2   2010-10-11  NaN
7   24  3   2010-10-14  3.0
8   24  4   2010-10-16  3.0
9   24  5   2010-10-19  4.0
10  24  0   2010-10-22  3.0

因此,我的问题在于当没有三个条目时,我得到的不是前两个或当前条目的内容,而是 NaN(非数字)。
1个回答

3

您可能正在寻找min_periods参数:

df1['rolling'] = df1.groupby('id')['PT'].rolling(window=3, min_periods=1).mean().reset_index(0, drop=True)



   id  PT        date  rolling
0   11   3  2010-10-10      3.0
1   11   3  2010-10-12      3.0
2   11   6  2010-10-16      4.0
3   11   0  2010-10-18      3.0
4   11   9  2010-10-22      5.0
5   24   4  2010-10-10      4.0
6   24   2  2010-10-11      3.0
7   24   3  2010-10-14      3.0
8   24   4  2010-10-16      3.0
9   24   5  2010-10-19      4.0
10  24   0  2010-10-22      3.0

如果有一些行出现多次怎么办?我希望这些行得到的平均值与只出现一次时相同;不应更改平均值计算。因此,我尝试按id和date进行分组df1.groupby(['id','date'],但出错了:插入列的不兼容索引与框架索引...所以,我搜索了这个错误,并发现要添加 df1.groupby(by = ['id','date'], as_index=False),但结果并不是我想要的 - Jagr
我发现一个似乎有效的方法是删除重复项,进行计算,然后将其合并回完整的数据框中。 - Jagr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接