如何解决每行固定时间窗内的平均值
我有一个像这样的数据框:
import pandas as pd
df = pd.DataFrame({'ID': [1,1,2,3,3],'val': [1,4,5,6,'time': [pd.Timestamp(2017,12),pd.Timestamp(2017,13),14),16),17),18),15),19),20)]})
我想创建一个新列,为每行提供val
之前24小时内所有具有相同ID
的行的平均值time
。
如何以pythonic方式执行此操作?而不是遍历每一行。
请注意,这不是平均值,而是“滚动平均值”,它是在特定时间范围内的平均值(对于每个ID
值)。
预期输出:
ID val time 24hr_avg
0 1 1 2017-01-01 12:00:00 1.0
1 1 2 2017-01-01 13:00:00 1.5
2 1 3 2017-01-01 14:00:00 2.0
3 1 1 2017-01-02 16:00:00 1.0
4 1 2 2017-01-02 17:00:00 1.5
5 1 3 2017-01-02 18:00:00 2.0
6 2 1 2017-01-01 12:00:00 1.0
7 2 2 2017-01-01 13:00:00 1.5
8 2 3 2017-01-01 14:00:00 2.0
9 2 4 2017-01-01 15:00:00 2.5
10 2 5 2017-01-01 16:00:00 3.0
11 2 6 2017-01-02 15:00:00 8.0
12 3 1 2017-01-01 12:00:00 1.0
13 3 2 2017-01-01 13:00:00 1.5
14 3 3 2017-01-01 14:00:00 2.0
15 3 4 2017-01-01 15:00:00 2.5
16 3 5 2017-01-01 16:00:00 3.0
17 3 6 2017-01-01 17:00:00 3.5
18 3 1 2017-01-02 18:00:00 1.0
19 3 2 2017-01-02 19:00:00 1.5
20 3 3 2017-01-02 20:00:00 2.0
解决方法
如果您首先set_index
时间栏,那么您可以在24H窗口中使用groupby.rolling
。然后merge
和原始数据:
df_ = df.merge(df.set_index('time').sort_index()
.groupby('ID')
.rolling('24H')
['val'].mean()
.rename('24hr_avg'),left_on=['ID','time'],right_index=True)
print(df_)
ID val time 24hr_avg
0 1 1 2017-01-01 12:00:00 1.0
1 1 2 2017-01-01 13:00:00 1.5
2 1 3 2017-01-01 14:00:00 2.0
3 1 1 2017-01-02 16:00:00 1.0
4 1 2 2017-01-02 17:00:00 1.5
5 1 3 2017-01-02 18:00:00 2.0
6 2 1 2017-01-01 12:00:00 1.0
7 2 2 2017-01-01 13:00:00 1.5
8 2 3 2017-01-01 14:00:00 2.0
9 2 4 2017-01-01 15:00:00 2.5
10 2 5 2017-01-01 16:00:00 3.0
11 2 6 2017-01-02 15:00:00 5.5
12 3 1 2017-01-01 12:00:00 1.0
13 3 2 2017-01-01 13:00:00 1.5
14 3 3 2017-01-01 14:00:00 2.0
15 3 4 2017-01-01 15:00:00 2.5
16 3 5 2017-01-01 16:00:00 3.0
17 3 6 2017-01-01 17:00:00 3.5
18 3 1 2017-01-02 18:00:00 1.0
19 3 2 2017-01-02 19:00:00 1.5
20 3 3 2017-01-02 20:00:00 2.0
,
我们可以使用Groupby.rolling
:
df['24hr_avg'] = (
df.set_index('time')
.groupby('ID',sort=False)['val']
.rolling('1D')
.mean()
.to_numpy()
)
ID val time 24hr_avg
0 1 1 2017-01-01 12:00:00 1.0
1 1 2 2017-01-01 13:00:00 1.5
2 1 3 2017-01-01 14:00:00 2.0
3 1 1 2017-01-02 16:00:00 1.0
4 1 2 2017-01-02 17:00:00 1.5
5 1 3 2017-01-02 18:00:00 2.0
6 2 1 2017-01-01 12:00:00 1.0
7 2 2 2017-01-01 13:00:00 1.5
8 2 3 2017-01-01 14:00:00 2.0
9 2 4 2017-01-01 15:00:00 2.5
10 2 5 2017-01-01 16:00:00 3.0
11 2 6 2017-01-02 15:00:00 5.5
12 3 1 2017-01-01 12:00:00 1.0
13 3 2 2017-01-01 13:00:00 1.5
14 3 3 2017-01-01 14:00:00 2.0
15 3 4 2017-01-01 15:00:00 2.5
16 3 5 2017-01-01 16:00:00 3.0
17 3 6 2017-01-01 17:00:00 3.5
18 3 1 2017-01-02 18:00:00 1.0
19 3 2 2017-01-02 19:00:00 1.5
20 3 3 2017-01-02 20:00:00 2.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。