计算以熊猫为单位的时间序列数据中最后3条记录的均值

时间:2018-10-24 07:29:32

标签: python pandas numpy

在我的时间序列数据帧中计算最后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”列计算的。

1 个答案:

答案 0 :(得分:1)

您需要groupbyrollingmean

#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)))