Python 如何将滚动窗口聚合结果保存回原始数据帧?
我有以下数据帧:Python 如何将滚动窗口聚合结果保存回原始数据帧?,python,pandas,dataframe,pandas-groupby,rolling-computation,Python,Pandas,Dataframe,Pandas Groupby,Rolling Computation,我有以下数据帧: UserID Amount Timestamp 50 1 600.00 2021-05-23 10:00:00 53 1 723.00 2021-05-24 05:12:00 54 2 1.00 2021-05-25 00:24:00 55 2 1000.00 2021-05-25 19:36:00 56 2 10000.00 2021-05
UserID Amount Timestamp
50 1 600.00 2021-05-23 10:00:00
53 1 723.00 2021-05-24 05:12:00
54 2 1.00 2021-05-25 00:24:00
55 2 1000.00 2021-05-25 19:36:00
56 2 10000.00 2021-05-26 14:48:00
58 3 30.00 2021-05-27 10:00:00
60 4 50.00 2021-05-28 05:12:00
64 4 500.00 2021-05-29 00:24:00
65 4 10.00 2021-05-29 19:36:00
66 4 235.52 2021-05-30 14:48:00
69 4 567.12 2021-05-31 10:00:00
我计算出的总量如下:
agg=df.groupby(['UserID']).rolling('15d',on='Timestamp')['Amount'].agg(['sum','mean','std'])
返回的内容不能立即添加回原始数据帧。我尝试了:df[['a','b','c']]=agg.values
,但是数据顺序不正确。
我不知道如何(更好,正确的方法是什么)将滚动窗口聚合结果保存回原始数据帧。首先像您已经做的那样计算聚合,但最后还要执行
reset_index()
,以获取包含所有其他列的数据帧
然后只需将此数据帧上的pd.merge
与UserId,Timestamp上的原始数据帧合并,即可添加回金额列:
>>> df2 = df.groupby(['UserID']).rolling('15d', on='Timestamp')['Amount'].agg(['sum', 'mean', 'std']).reset_index()
>>> df = pd.merge(df, df2, on=['UserID','Timestamp'])
>>> df
UserID Amount Timestamp sum mean std
0 1 600.00 2021-05-23 10:00:00 600.00 600.000000 NaN
1 1 723.00 2021-05-24 05:12:00 1323.00 661.500000 86.974134
2 2 1.00 2021-05-25 00:24:00 1.00 1.000000 NaN
3 2 1000.00 2021-05-25 19:36:00 1001.00 500.500000 706.399674
4 2 10000.00 2021-05-26 14:48:00 11001.00 3667.000000 5507.237692
5 3 30.00 2021-05-27 10:00:00 30.00 30.000000 NaN
6 4 50.00 2021-05-28 05:12:00 50.00 50.000000 NaN
7 4 500.00 2021-05-29 00:24:00 550.00 275.000000 318.198052
8 4 10.00 2021-05-29 19:36:00 560.00 186.666667 272.090671
9 4 235.52 2021-05-30 14:48:00 795.52 198.880000 223.499928
10 4 567.12 2021-05-31 10:00:00 1362.64 272.528000 254.134419
您得到的错误是什么?@Ank如果我尝试直接使用
s[['a',b',c']]=agg添加结果,我得到ValueError:缓冲区数据类型不匹配,预期为“Python对象”,但得到了“long”。上述异常是以下异常的直接原因:TypeError:插入列的索引与框架索引不兼容
添加了答案,这就是您要查找的吗?@Ank我要查找的解决方案应保持正确的顺序。我还将按多个列进行分组(示例中未显示),因此应该考虑到这一点。索引(不是从0开始的整数和跳过的数字)应该保持不变。如果我要按多个列分组,我应该更改merge“on”参数还是仍然是这三列?您必须将它们全部放在on
param和“Timestamp”列中,以正确匹配行。假设列“UserID”,“a”,“b”,“c”
在groupby中,然后pd.merge(..,on=['UserID','a','b','c','Timestamp',…)