#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