为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2021-08-02 15:08:35
我只想知道如何根据每一行的 id 获取最后 5 个值的总和。df:id       values-----------------a        5a        10a        10b        2c        2d        2a        5a        10a        20a        10a        15a        20预期 df:id       values       sum(x.tail(5))-------------------------------------a        5            NaNa        10           NaNa        10           NaNb        2            NaNc        2            NaNd        2            NaNa        5            NaNa        10           NaNa        20           40a        10           55a        15           55a        20           60为简单起见,我试图从仅id a 的每一行中找到最后 5 行的值的总和。我尝试使用代码df.apply(lambda x: x.tail(5)),但只显示了整个 df 的最后一行的最后 5 行。我想从每一行中获取最后第 n 行的总和。基本上它就像时间序列数据的rolling_sum。
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

您可以像这样计算最后 5 个的总和:


df["rolling As"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"]

(这包括当前行作为 5 行之一。不确定这是否是您想要的)


id  values  rolling As

0   a   5   NaN

1   a   10  NaN

2   a   10  NaN

3   b   2   NaN

4   c   2   NaN

5   d   5   NaN

6   a   10  NaN

7   a   20  55.0

8   a   10  60.0

9   a   10  60.0

10  a   15  65.0

11  a   20  75.0

如果你不想包含它。你可以转移


df["rolling"] = df[df['id'] == 'a'].rolling(window=5).sum()["values"].shift()

给予:


id  values  rolling

0   a   5   NaN

1   a   10  NaN

2   a   10  NaN

3   b   2   NaN

4   c   2   NaN

5   d   5   NaN

6   a   10  NaN

7   a   20  NaN

8   a   10  55.0

9   a   10  60.0

10  a   15  60.0

11  a   20  65.0


查看完整回答
反对 回复 2021-08-03
?
茅侃侃

TA贡献1842条经验 获得超21个赞

尝试使用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             NaN

2   a     10             NaN

3   a     10             NaN

4   b      2             NaN

5   c      2             NaN

6   d      2             NaN

7   a      5             NaN

8   a     10             NaN

9   a     20            40.0

10  a     10            55.0

11  a     15            55.0

12  a     20            60.0


查看完整回答
反对 回复 2021-08-03
  • 2 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号