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]
我有一个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]