Подсчет последовательных 1 и 0, увеличение до определенного значения, затем сброс подсчета

#python #pandas #numpy

Вопрос:

У меня есть столбец «порог» из df «месяц», который выглядит так:

 threshold   
1
1
1
1
1
0
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
 

Я использовал следующий код для подсчета последовательных последовательностей ‘1:

 thresh = np.asarray(month['threshold'].groupby(month['threshold'].diff().ne(0).cumsum()).cumsum())
 

в результате чего было достигнуто следующее:

 array([1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
 

Мне нужно посчитать последовательности ровно из 5 (5 дней-это то, что он обозначает). Есть ли какой-нибудь способ заставить код считать до 5, а затем возобновить подсчет после того, как он достигнет этих 5? Например, как бы я хотел, чтобы приведенный выше массив выглядел:

 array([1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5])
 

Так что никаких чисел больше 5. Подсчет до 5, а затем перезапуск (в 1, если все еще 1, в противном случае это 0). После этого я буду считать эти экземпляры по 5, так что в приведенном выше примере это будет 4 отдельных экземпляра.

Комментарии:

1. Как будет выглядеть результат для этого набора образцов?

Ответ №1:

С вашим базовым кодом:

 >>> np.where(thresh > 5, (thresh - 1) % 5   1, thresh)
array([1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
       2, 3, 4, 5, 1, 2, 3, 4, 5])
 

Комментарии:

1. Это неправильно. При значении 11 он вернет значение 6.

2. @AlbertoMQ. Вы совершенно правы! Я исправил свой ответ. ТАЙ!

3. @спокати. Я обновил свой ответ после комментария AlbertoMQ, но метод все тот же.

4. Спасибо за обновление, я заметил это, когда играл с ним.

Ответ №2:

Я использую cumcount с % с номером thresh = 5

 out = (month['threshold'].
       groupby(month['threshold'].diff().ne(0).cumsum()).
       cumcount()%thresh  1).
                   mask(month['threshold']==0,0)
Out[248]: 
0     1
1     2
2     3
3     4
4     5
5     0
6     1
7     2
8     3
9     4
10    5
11    1
12    0
13    0
14    0
15    0
16    0
17    0
18    0
19    0
20    0
21    1
22    2
23    3
24    4
25    5
26    1
27    2
28    3
29    4
30    5
dtype: int64