我有一个看起来像
的数据框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>
答案 0 :(得分:1)
所有日期时间都连续的解决方案:
在上一个和前四个季度中,将GroupBy.tail
与5
一起使用,与Series.lt
进行比较,用Series.reindex
添加缺失值,如果需要,将{{1}强制转换为整数}到True/False
的映射:
1/0
编辑:对于通过Series.between
功能创建的计数器列,可以通过将DataFrame.ne
(!=)与DataFrame.shift
和DataFrame.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