【问题标题】:Pandas Rolling Groupby Shift back 1, Trying to lag rolling sumPandas Rolling Groupby Shift back 1,试图滞后滚动总和
【发布时间】:2019-06-18 15:45:10
【问题描述】:

我正在尝试获取相同 ID 的过去 3 行的滚动总和,但滞后 1 行。我的尝试看起来像下面的代码,我是列。必须有一种方法可以做到这一点,但这种方法似乎不起作用。

for i in df.columns.values:
    df.groupby('Id', group_keys=False)[i].rolling(window=3, min_periods=2).mean().shift(1)


id    dollars  lag

1      6       nan
1      7       nan
1      6       6.5
3      7       nan
3      4       nan
3      4       5.5
3      3       5
5      6       nan
5      5       nan
5      6       5.5
5      12      5.67
5      7       8.3

【问题讨论】:

  • 向这个问题添加一些示例数据和预期输出。
  • 检查与应用类似df.groupby('Id', group_keys=False)[i].apply(lambda x : x.rolling(window=3, min_periods=2).mean().shift(1))
  • 没用,TabError ;缩进中制表符和空格的不一致使用
  • 您的标题显示“sum”,但您的代码显示“mean”。您能否提供示例数据并描述预期输出?

标签: python pandas pandas-groupby rolling-sum


【解决方案1】:

我正在尝试获取相同 ID 的过去 3 行的滚动总和,但滞后 1 行。

您可以通过将DataFrame.groupby(ID).shift(1) 用于滞后 1、.rolling(3) 用于窗口 3 和 .sum() 用于总和来创建滞后滚动总和。

示例:假设您的数据集是:

import pandas as pd
# Reproducible datasets are your friend!
d = pd.DataFrame({'grp':pd.Series(['A']*4 + ['B']*5 + ['C']*6),
                  'x':pd.Series(range(15))})
print(d)
 grp   x
   A   0
   A   1
   A   2
   A   3
   B   4
   B   5
   B   6
   B   7
   B   8
   C   9
   C  10
   C  11
   C  12
   C  13
   C  14

我想你要的是这个:

d['y'] = d.groupby('grp')['x'].shift(1).rolling(3).sum()
print(d)
 grp   x     y
   A   0   NaN
   A   1   NaN
   A   2   NaN
   A   3   3.0
   B   4   NaN
   B   5   NaN
   B   6   NaN
   B   7  15.0
   B   8  18.0
   C   9   NaN
   C  10   NaN
   C  11   NaN
   C  12  30.0
   C  13  33.0
   C  14  36.0

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 2018-08-04
    • 1970-01-01
    • 2021-05-18
    • 2020-02-22
    • 1970-01-01
    • 2017-08-25
    • 2019-11-15
    • 2021-09-22
    相关资源
    最近更新 更多