python - Pandas :过去n天的平均值

标签 python pandas time-series aggregation

我有一个像这样的 Pandas 数据框:

test = pd.DataFrame({ 'Date' : ['2016-04-01','2016-04-01','2016-04-02',
                             '2016-04-02','2016-04-03','2016-04-04',
                             '2016-04-05','2016-04-06','2016-04-06'],
                      'User' : ['Mike','John','Mike','John','Mike','Mike',
                             'Mike','Mike','John'],
                      'Value' : [1,2,1,3,4.5,1,2,3,6]
                })

正如您在下面看到的,数据集不一定有每天的观察值:

         Date  User  Value
0  2016-04-01  Mike    1.0
1  2016-04-01  John    2.0
2  2016-04-02  Mike    1.0
3  2016-04-02  John    3.0
4  2016-04-03  Mike    4.5
5  2016-04-04  Mike    1.0
6  2016-04-05  Mike    2.0
7  2016-04-06  Mike    3.0
8  2016-04-06  John    6.0

如果至少有一天可用,我想添加一个新列,显示过去 n 天(在本例中为 n = 2)每个用户的平均值,否则它将有 nan 值。例如,在 2016-04-06 上,John 得到一个 nan,因为他没有 2016-04-052016 的数据-04-04。所以结果将是这样的:

         Date  User  Value  Value_Average_Past_2_days
0  2016-04-01  Mike    1.0                        NaN
1  2016-04-01  John    2.0                        NaN
2  2016-04-02  Mike    1.0                       1.00
3  2016-04-02  John    3.0                       2.00
4  2016-04-03  Mike    4.5                       1.00
5  2016-04-04  Mike    1.0                       2.75
6  2016-04-05  Mike    2.0                       2.75
7  2016-04-06  Mike    3.0                       1.50
8  2016-04-06  John    6.0                        NaN

在阅读了论坛中的几篇帖子后,我似乎应该结合使用 group_by 和自定义 rolling_mean ,但我不太明白该怎么做。

最佳答案

我认为您可以先使用转换列 Date to_datetime ,然后通过 groupby 找到缺失的 Daysresample最后apply rolling

test['Date'] = pd.to_datetime(test['Date'])

df = test.groupby('User').apply(lambda x: x.set_index('Date').resample('1D').first())
print df
                 User  Value
User Date                   
John 2016-04-01  John    2.0
     2016-04-02  John    3.0
     2016-04-03   NaN    NaN
     2016-04-04   NaN    NaN
     2016-04-05   NaN    NaN
     2016-04-06  John    6.0
Mike 2016-04-01  Mike    1.0
     2016-04-02  Mike    1.0
     2016-04-03  Mike    4.5
     2016-04-04  Mike    1.0
     2016-04-05  Mike    2.0

df1 = df.groupby(level=0)['Value']
        .apply(lambda x: x.shift().rolling(min_periods=1,window=2).mean())
        .reset_index(name='Value_Average_Past_2_days')
print df1
    User       Date  Value_Average_Past_2_days
0   John 2016-04-01                        NaN
1   John 2016-04-02                       2.00
2   John 2016-04-03                       2.50
3   John 2016-04-04                       3.00
4   John 2016-04-05                        NaN
5   John 2016-04-06                        NaN
6   Mike 2016-04-01                        NaN
7   Mike 2016-04-02                       1.00
8   Mike 2016-04-03                       1.00
9   Mike 2016-04-04                       2.75
10  Mike 2016-04-05                       2.75
11  Mike 2016-04-06                       1.50

print pd.merge(test, df1, on=['Date', 'User'], how='left')
        Date  User  Value  Value_Average_Past_2_days
0 2016-04-01  Mike    1.0                        NaN
1 2016-04-01  John    2.0                        NaN
2 2016-04-02  Mike    1.0                       1.00
3 2016-04-02  John    3.0                       2.00
4 2016-04-03  Mike    4.5                       1.00
5 2016-04-04  Mike    1.0                       2.75
6 2016-04-05  Mike    2.0                       2.75
7 2016-04-06  Mike    3.0                       1.50
8 2016-04-06  John    6.0                        NaN

关于python - Pandas :过去n天的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36969174/

相关文章:

python - randomkit.h 发生了什么或如何迁移到最新的 numpy.random c/cython api

python - 计算耗时

python - 将数据帧行附加到其他数据帧的特定值 - python

python - 用 NaN 替换数据框列中低于特定阈值的值

python - 使用重采样对齐 Pandas 中的多个时间序列

python - 具有可变长度序列掩码的 LSTM 变分自动编码器

python - 当字符串更改时,如何在不同的数据框中写入初始日期和最终日期?

python - 如何在 SQLAlchemy 中将 "ANY"过滤器与 "<<="运算符结合使用?

python - 在 Nvidia-Docker 中运行 CUFFT 例程

python - 将 IBM_DB 与 Pandas 结合使用