Python dataframe 通过列获取零段的边界

Python dataframe get borders of zeros segments throught the column

我有一个pandas系列:

s = [3,7,8,0,0,0,6,12,0,0,0,0,0,8,5,0,2]

我想找到所有以零段开始或结束的索引,其中零的数量超过 3 所以在这里我想得到:

[8,12]

最好的方法是什么?

谢谢

定义一个标志,告诉循环是否检查 0 是否存在。 entryFlag 告诉是否检查 0s 的入口或出口。

s = [3,7,8,0,0,0,6,12,0,0,0,0,0,8,5,0,2]
entryFlag=True
i=0
s2=[]
for x in s:

    if entryFlag:
        if x==0:
            s2.append(i)
            entryFlag=False
    else:
        if x!=0:
            s2.append(i-1)
            entryFlag=True
    i+=1
print(s2)

考虑到 s 是系列(不是您提供的列表),我使用 more_itertools 找到了这种方式:

先将满足条件的索引按连续元素分组:

import more_itertools as mit
a = [list(group) for group in mit.consecutive_groups(s.loc[s.eq(0)].index.tolist())]

其次,select第一个和最后一个条目构成列表

list(set([i[0] for i in a]+[x[-1] for x in a]))
#[3, 5, 8, 12, 15]

EDIT 获取第一个和最后一个索引,其中 0 大于 3 使用:

list(set([i[0] for i in a if len(i)>3]+[x[-1] for x in a if len(x)>3]))
#[8, 12]
s = [3,7,8,0,0,0,6,12,0,0,0,0,0,8,5,0,2]
idx = []
for i in range(len(s)):
    if s[i] == 0 and (s[i+1] != 0 or s[i-1] != 0):
        idx.append(i)
print (idx)
# result :[3, 5, 8, 12, 15]