按组 ID 获取最后第 n 行的值的总和

我只想知道如何根据每一行的 id 获取最后 5 个值的总和。


df:


id       values

-----------------

a        5

a        10

a        10

b        2

c        2

d        2

a        5

a        10

a        20

a        10

a        15

a        20

预期 df:


id       values       sum(x.tail(5))

-------------------------------------

a        5            NaN

a        10           NaN

a        10           NaN

b        2            NaN

c        2            NaN

d        2            NaN

a        5            NaN

a        10           NaN

a        20           40

a        10           55

a        15           55

a        20           60

为简单起见,我试图从仅id a 的每一行中找到最后 5 行的值的总和。


我尝试使用代码df.apply(lambda x: x.tail(5)),但只显示了整个 df 的最后一行的最后 5 行。我想从每一行中获取最后第 n 行的总和。基本上它就像时间序列数据的rolling_sum。


HUX布斯
浏览 178回答 2
2回答

胡子哥哥

您可以像这样计算最后 5 个的总和:df["rolling As"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"](这包括当前行作为 5 行之一。不确定这是否是您想要的)id  values  rolling As0   a   5   NaN1   a   10  NaN2   a   10  NaN3   b   2   NaN4   c   2   NaN5   d   5   NaN6   a   10  NaN7   a   20  55.08   a   10  60.09   a   10  60.010  a   15  65.011  a   20  75.0如果你不想包含它。你可以转移df["rolling"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"].shift()给予:id  values  rolling0   a   5   NaN1   a   10  NaN2   a   10  NaN3   b   2   NaN4   c   2   NaN5   d   5   NaN6   a   10  NaN7   a   20  NaN8   a   10  55.09   a   10  60.010  a   15  60.011  a   20  65.0

茅侃侃

尝试使用groupby, transform, 和rolling:df['sum(x.tail(5))'] = df.groupby('id')['values']\                         .transform(lambda x: x.rolling(5, min_periods=5).sum().shift())输出:   id values  sum(x.tail(5))1   a      5             NaN2   a     10             NaN3   a     10             NaN4   b      2             NaN5   c      2             NaN6   d      2             NaN7   a      5             NaN8   a     10             NaN9   a     20            40.010  a     10            55.011  a     15            55.012  a     20            60.0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python