检查值是否遵循后续时间序列值的条件

时间:2019-04-30 10:13:54

标签: python pandas

我有一个看起来像

的数据框
ID      DATE          PROFIT
2342  2017-03-01       457
2342  2017-06-01       658
2342  2017-09-01       3456
2342  2017-12-01       345
2342  2018-03-01       235
2342  2018-06-01       23
808   2017-03-01       9346
808   2017-06-01       54
808   2017-09-01       314
808   2017-12-01       57
....
....

对于每个ID:

让我们说我想知道利润是否保持在200到1000之间。

我要以这样的方式进行操作:计数器(新列)指示连续有多少个季度(最新和之前)满足了此条件。 如果由于某种原因,中间四分之一之一不符合条件,则计数器应重置。

我正在考虑使用 shift 功能访问/调整前几行的条件,但是,如果有更好的方法来检查日期时间值中的条件,将是一个很好的了解。 / p>

1 个答案:

答案 0 :(得分:1)

所有日期时间都连续的解决方案:

在上一个和前四个季度中,将GroupBy.tail5一起使用,与Series.lt进行比较,用Series.reindex添加缺失值,如果需要,将{{1}强制转换为整数}到True/False的映射:

1/0

编辑:对于通过Series.between功能创建的计数器列,可以通过将DataFrame.ne(!=)与DataFrame.shiftDataFrame.cumsum进行比较并最后使用{{3 }}与GroupBy.cumcount乘以df['flag'] = (df.groupby('ID')['PROFIT'] .tail(5) .lt(1000) .reindex(df.index, fill_value=False) .astype(int)) print (df) ID DATE PROFIT flag 0 2342 2017-03-01 457 0 #<-6.th value no match 1 2342 2017-06-01 658 1 2 2342 2017-09-01 3456 0 3 2342 2017-12-01 345 1 4 2342 2018-03-01 235 1 5 2342 2018-06-01 23 1 6 808 2017-03-01 9346 0 7 808 2017-06-01 54 1 8 808 2017-09-01 314 1 9 808 2017-12-01 57 1 组,并连续0组:

0