Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将滚动窗口聚合结果保存回原始数据帧?_Python_Pandas_Dataframe_Pandas Groupby_Rolling Computation - Fatal编程技术网

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',…)