我试图按组获取多个列的滚动总和,在日期时间列上进行滚动(即在指定的时间间隔内)。对单个列进行滚动似乎运行良好,但是当我通过向量化滚动多个列时,我得到了意外的结果。
我的第一次尝试:
df = pd.DataFrame({"column1": range(6),
"column2": range(6),
'group': 3*['A','B'],
'date':pd.date_range("20190101", periods=6)})
(df.groupby('group').rolling("1d", on='date')['column1'].sum()).groupby('group').shift(fill_value=0)
# output:
group date
A 2019-01-01 0.0
2019-01-03 0.0
2019-01-05 2.0
B 2019-01-02 0.0
2019-01-04 1.0
2019-01-06 3.0
Name: column1, dtype: float64
上述操作产生了期望的结果,但我在过程中丢失了原始索引。由于我的数据中有一些日期是相同的,所以我需要在组合+日期上重新加入到原始数据帧上,但这很低效。因此,为避免这种情况并保留原始索引,我采用了以下方法:
df.groupby('group').apply(lambda x: x.rolling("1d", on='date')['column1'].sum().shift(fill_value=0))
# output:
group
A 0 0.0
2 0.0
4 2.0
B 1 0.0
3 1.0
5 3.0
Name: column1, dtype: float64
使用这种方法,我可以轻松将其分配给原始数据框的新列,方法是按索引排序。现在,我想对'column2'重复相同的步骤,并通过矢量化完成。然而,我得到的结果出乎意料:
df.groupby('group').apply(lambda x: x.rolling("1d", on='date')[['column1','column2']].sum().shift(fill_value=0))
# output:
column1 column2 date
0 0.0 0.0 1970-01-01
1 0.0 0.0 1970-01-01
2 0.0 0.0 2019-01-01
3 1.0 1.0 2019-01-02
4 2.0 2.0 2019-01-03
5 3.0 3.0 2019-01-04
结果是正确的,但出乎意料,原因如下:(1)在groupby中忽略了group_keys;(2)它自动排序结果并像“transform”方法一样重置了索引。我想理解为什么会发生这种情况,还想知道是否有其他方法可以实现上述结果。
(df.groupby('group').rolling("3d", on='date')['column1'].sum()).groupby('group').shift(fill_value=0)
并将其与您的相同数据示例进行比较。 - nrcjea001