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

假设我有这样的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)



慕后森
浏览 96回答 2
2回答

HUX布斯

很高兴看到您在访问/调用 pandas 数据框时是否遇到问题。这是基于rolling(win)and的可能解决方案max():import pandas as pdd  = dict(row = [0,0,0,0,0,0,0,1,0,0,0,0,0,0])df = pd.DataFrame(d)win = 6df['winMax'] = df.rolling(win).max().shift(-win+1)print(df)>    row  winMax0     0     0.01     0     0.02     0     1.03     0     1.04     0     1.05     0     1.06     0     1.07     1     1.08     0     0.09     0     NaN10    0     NaN11    0     NaN12    0     NaN13    0     NaN

达令说

pandasql 可能的解决方案。有没有办法避免使用它?from pandasql import sqldfdf_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      """)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python