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

如何让滚动窗口从熊猫的未来(后续)窗口中迭代?

如何让滚动窗口从熊猫的未来(后续)窗口中迭代?

慕后森 2022-11-01 14:45:59
假设我有这样的df:| 编号| 日期 | 目标行|| 1| 2016-01-01 | 0|| 1| 2016-02-01 | 0|| 1| 2016-03-01| 0|| 1 | 2016-04-01| 0|| 1| 2016-05-01| 1|| 1| 2016-06-01| 0|| 1| 2016-07-01| 0|| 1| 2016-08-01| 0|我的任务是检查接下来的 4 个target_row值是否为 1 - 包括当前值,因此它应该是 1。( groupby('id') is needed)。所以希望输出这个:| 编号| 日期 | 目标行|下一个_6_目标| 1| 2016-01-01 | 0| 0| 1| 2016-02-01 | 0| 1| 1| 2016-03-01| 0| 1| 1 | 2016-04-01| 0| 1| 1| 2016-05-01| 1| 1| 1| 2016-06-01| 0| 0| 1| 2016-07-01| 0| 0| 1| 2016-08-01| 0| 0我试过这种方式: df['next_6_target'] = df.groupby('id').rolling(window=6)[['target_row']].max().reset_index(drop=True)然后执行移位 - 但它给出了错误的结果在 SQL 解决方案中应该是这样的:MAX(target_row) OVER (PARTITION BY ID ORDER BY DATE ROWS BETWEEN CURRENT ROW AND 3 FOLLOWING)
查看完整描述

2 回答

?
HUX布斯

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

很高兴看到您在访问/调用 pandas 数据框时是否遇到问题。


这是基于rolling(win)and的可能解决方案max():


import pandas as pd

d  = dict(row = [0,0,0,0,0,0,0,1,0,0,0,0,0,0])

df = pd.DataFrame(d)


win = 6

df['winMax'] = df.rolling(win).max().shift(-win+1)

print(df)


>

    row  winMax

0     0     0.0

1     0     0.0

2     0     1.0

3     0     1.0

4     0     1.0

5     0     1.0

6     0     1.0

7     1     1.0

8     0     0.0

9     0     NaN

10    0     NaN

11    0     NaN

12    0     NaN

13    0     NaN


查看完整回答
反对 回复 2022-11-01
?
达令说

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

pandasql 可能的解决方案。有没有办法避免使用它?


from pandasql import sqldf

df_final = sqldf("""SELECT id, date, target_row, 

MAX(target_row) OVER (PARTITION BY id ORDER BY date ROWS BETWEEN CURRENT ROW AND 6 FOLLOWING)

FROM df

      """)


查看完整回答
反对 回复 2022-11-01
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

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

帮助反馈 APP下载

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

公众号

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