注意:我已经知道这个问题的答案,我发布它只是因为我在堆栈溢出上找不到正确的答案,我花了惊人的时间来弄清楚它。话虽如此,请随时建议其他选项。
问题
我有一个带有三列的pandas DataFrame,一个跟踪日期,一个跟踪相关观察结果(即我的分组列),第三个变量存储一些数值。对于我的数据帧中的每个组,我想计算日期列上的滚动总和。警告:数据帧中缺少一些日期,我想将它们视为值为0的观测值。我不想使用交叉联接来添加所有日期。
可重现示例
让我们有一个这样的数据帧:
df = pd.DataFrame({'id_col' : np.array([1,1,1,1,1,1,2,2,2,2,2,3,3,3]),
'value_col' : np.random.randint(0,5,size=14),
'dates' : pd.to_datetime(np.array([
'2018-01-01',
'2018-02-01',
'2018-03-01',
'2018-05-01',
'2018-06-01',
'2018-09-01',
'2018-01-01',
'2018-02-01',
'2018-05-01',
'2018-06-01',
'2018-07-01',
'2018-01-01',
'2018-02-01',
'2018-03-01'])
)}
)
数据如下所示:
id_col value_col dates
0 1 0 2018-01-01
1 1 1 2018-02-01
2 1 4 2018-03-01
3 1 0 2018-05-01
4 1 3 2018-06-01
5 1 3 2018-09-01
6 2 4 2018-01-01
7 2 3 2018-02-01
8 2 2 2018-05-01
9 2 0 2018-06-01
10 2 2 2018-07-01
11 3 4 2018-01-01
12 3 2 2018-02-01
13 3 3 2018-03-01
我尝试过的方法不起作用:
选项 1:完全忽略缺失的日期
df.groupby(['id_col']).rolling(2)['value_col'].sum().reset_index()
选项 2:基于 pandas 滚动文档,使用 pandas 偏移参数替换窗口宽度(返回)。如果将日期列用作数据帧的索引,则此方法将起作用。不幸的是,我们不能在这里使用简单的索引,因为来自id_col的2个不同的ID可以包含相同的日期。(我们可以创建 MultiIndex,但随后得到相同的值错误)。ValueError: window must be an integer
df.groupby(['id_col']).rolling('60d')['value_col'].sum().reset_index()
什么有效,但不是很简单:
选项 1:交叉联接以填写所有缺失的日期(如果数据量很大,可能很难)
选项 2:从可迭代对象的笛卡尔积构建多索引,如这个答案所示。这实际上与上述选项非常相似。
沧海一幻觉
相关分类