идентифицировать группы последовательных значений True в pd.Serie - PullRequest
0 голосов
/ 05 марта 2019

У меня есть логическое значение pd.Series.

S=pd.Series([True,False,True,True,False])

Мне нужно идентифицировать блоки в S, которые представляют собой как минимум 2 последовательных истинных элемента.Если я сделаю

np.logical_and(S,S.shift(-1))

, я получу правильные элементы, но в каждом блоке отсутствует один элемент.Вместо этого я хотел бы получить следующие значения

pd.Series([False,False,True,True,False])

, поэтому Series того же размера, что и оригинал, с одним True, замененным False.

1 Ответ

0 голосов
/ 05 марта 2019

Сначала создайте уникальные последовательные группы путем сравнения на Series.ne с Series.shift и Series.cumsum, а затем подсчитайте значения на Series.map с Series.value_counts или GroupBy.transform с GroupBy.size:

b = S.ne(S.shift()).cumsum()
c = b.map(b.value_counts()) == 2

Или:

c = b.groupby(b).transform('size') == 2

print (c)
0    False
1    False
2     True
3     True
4    False
dtype: bool
...