在我的时间序列数据帧中计算最后3条记录的平均值时遇到的问题。以下是数据示例
serial,date,feature1,,,,,,,,,,,,,,,,,
1,5/19/2017,-5.199338,,,,,,,,,,,,,,,,,
5,6/12/2017,-25.199338,,,,,,,,,,,,,,,,,
5,6/23/2017,5.199338,,,,,,,,,,,,,,,,,
2,7/1/2017,8.199338,,,,,,,,,,,,,,,,,
1,7/17/2017,3.199338,,,,,,,,,,,,,,,,,
1,7/29/2017,76.199338,,,,,,,,,,,,,,,,,
2,8/19/2017,13.199338,,,,,,,,,,,,,,,,,
6,9/19/2017,785.199338,,,,,,,,,,,,,,,,,
3,10/28/2017,5.199338,,,,,,,,,,,,,,,,,
4,11/2/2017,67.199338,,,,,,,,,,,,,,,,,
2,11/28/2017,49.199338,,,,,,,,,,,,,,,,,
2,12/29/2017,20.199338,,,,,,,,,,,,,,,,,
3,1/29/2018,19.199338,,,,,,,,,,,,,,,,,
4,3/13/2018,-15.199338,,,,,,,,,,,,,,,,,
1,3/28/2018,-5.199338,,,,,,,,,,,,,,,,,
要求是在数据框中添加另一列,例如mean
,这将是具有相似的feature1
数字的最后3行的平均值(对于列serial
)。必须对每一行都这样做。
例如下面一行的平均值计算
1,3/28/2018,-5.199338,,,,,,,,,,,,,,,,,
将通过使用以下数据集-
完成1,7/17/2017,3.199338,,,,,,,,,,,,,,,,,
1,7/29/2017,76.199338,,,,,,,,,,,,,,,,,
1,3/28/2018,-5.199338,,,,,,,,,,,,,,,,,
计算出平均值后,该行应该会喜欢
serial,date,feature1,mean_feature1,,,,,,,,,,,,,,,,,
...........................
1,3/28/2018,-5.199338,24.7333,,,,,,,,,,,,,,,,
我的问题陈述与下面的文章类似,但是它使用滚动,这需要确定的窗口,在我的情况下是随机的- Pandas: Average value for the past n days
预期输出-
serial,date,feature1,mean_feature1,,,,,,,,,,,,,,,,
1,5/19/2017,-5.199338,-5.199338,,,,,,,,,,,,,,,,
5,6/12/2017,-25.199338,-25.199338,,,,,,,,,,,,,,,,
5,6/23/2017,5.199338,-10.0,,,,,,,,,,,,,,,,
2,7/1/2017,8.199338,8.199338,,,,,,,,,,,,,,,,
1,7/17/2017,3.199338,-1,,,,,,,,,,,,,,,,
1,7/29/2017,76.199338,24.xxx,,,,,,,,,,,,,,,,
2,8/19/2017,13.199338,10.7xx,,,,,,,,,,,,,,,,
6,9/19/2017,785.199338,785.199338,,,,,,,,,,,,,,,,
3,10/28/2017,5.199338,5.199338,,,,,,,,,,,,,,,,
4,11/2/2017,67.199338,67.199338,,,,,,,,,,,,,,,,
2,11/28/2017,49.199338,23.xxx,,,,,,,,,,,,,,,,
2,12/29/2017,20.199338,27.xx,,,,,,,,,,,,,,,,
3,1/29/2018,19.199338,12.xxx,,,,,,,,,,,,,,,,
4,3/13/2018,-15.199338,26.xxxx,,,,,,,,,,,,,,,,
1,3/28/2018,-5.199338,24.xxxxx,,,,,,,,,,,,,,,,
请注意,值大约是针对“ mean_feature1”列计算的。
答案 0 :(得分:1)
#if necessary remove only NaNs columns
df = df.dropna(how='all', axis=1)
df['mean_feature1'] = (df.groupby('serial',sort=False)['feature1']
.rolling(3, min_periods=1).mean()
.reset_index(drop=True))
print (df)
serial date feature1 mean_feature1
0 1 5/19/2017 -5.199338 -5.199338
1 5 6/12/2017 -25.199338 -25.199338
2 5 6/23/2017 5.199338 -10.000000
3 2 7/1/2017 8.199338 8.199338
4 1 7/17/2017 3.199338 -1.000000
5 1 7/29/2017 76.199338 24.733113
6 2 8/19/2017 13.199338 10.699338
7 6 9/19/2017 785.199338 785.199338
8 3 10/28/2017 5.199338 5.199338
9 4 11/2/2017 67.199338 67.199338
10 2 11/28/2017 49.199338 23.532671
11 2 12/29/2017 20.199338 27.532671
12 3 1/29/2018 19.199338 12.199338
13 4 3/13/2018 -15.199338 26.000000
14 1 3/28/2018 -5.199338 24.733113
如果要按位置insert
列:
df.insert(3, 'mean_feature1', (df.groupby('serial',sort=False)['feature1']
.rolling(3, min_periods=1).mean()
.reset_index(drop=True)))