识别具有容差的连续True值块

3

我有一个布尔型的pandas DataFrame

w=pd.DataFrame(data=[True,False,True,True,True,False,False,True,False,True,True,False,True])

我正在尝试识别长度至少为N的True值块:

我可以按照SO上的建议进行操作:

N=3.0
b = w.ne(w.shift()).cumsum() *w
m = b[0].map(b[0].mask(b[0] == 0).value_counts()) >= N

这个功能很好用,返回结果正常

m
0     False
1     False
2      True
3      True
4      True
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False

现在,我需要做同样的事情,但需要允许一些容差来确定块。因此,我想识别至少有N个元素的所有块,但允许M个值(可以任意放置在块内)为 False

以示例w为例,当N=3,M=1时应为:

w
0    True
1   False
2    True
3    True
4    True
5   False
6   False
7    True
8   False
9    True
10   True
11  False
12   True

与以前的结果不同,位置在:
desidered=
0    **True**
1    **True**
2    True
3    True
4    True
5   False
6   False
7    True
8  ** True **
9    True
10   True
11   **True**
12   True
1个回答

1

我相信您可以通过使用取反符号~来重复使用倒置m的解决方案,并将两个条件用or连接:

N = 3.0
M = 1
b = w.ne(w.shift()).cumsum() *w
m = b[0].map(b[0].mask(b[0] == 0).value_counts()) <= N

w1 = ~m
b1 = w1.ne(w1.shift()).cumsum() * w1
m1 = b1.map(b1.mask(b1 == 0).value_counts()) == M 

m = m | m1

print (m)
0      True
1      True
2      True
3      True
4      True
5     False
6     False
7      True
8      True
9      True
10     True
11     True
12     True
Name: 0, dtype: bool

1
布尔逻辑始终是最干净的,确实,答案是正确的,稍后将批准。 - 00__00__00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接