我有一个布尔值pd.Series。
S=pd.Series([True,False,True,True,False])
我需要确定S中的块,它们至少是2个连续的True元素。 如果我这样做
np.logical_and(S,S.shift(-1))
然后我得到正确的元素,但是每个块都缺少一个元素。 相反,我想得到以下内容
pd.Series([False,False,True,True,False])
因此大小为Series
与原始大小相同,其中单个True
被False
替换。
答案 0 :(得分:1)
首先通过将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