Dataframe Python получает границы сегментов нулей через столбец - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть серия панд:

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

Я хочу найти все индексы, в которых есть начало или конец сегмента нулей, где число нулей больше 3, поэтому здесьЯ хочу получить:

[8,12]

Какой лучший способ сделать это?

Спасибо

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Я нашел этот способ, используя more_itertools с учетом s - это серия (а не список, который вы предоставили):

Сначала сгруппируйте список в последовательные элементы дляиндекс, который удовлетворяет условию:

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

Во-вторых, выберите первую и последнюю записи из списка

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

РЕДАКТИРОВАТЬ для получения первого и последнего индекса, где 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]
0 голосов
/ 15 февраля 2019
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]
0 голосов
/ 15 февраля 2019

Определите флаг, который сообщает циклу, проверять наличие или отсутствие 0. entryFlag указывает, проверять ли запись 0 или выход.

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)
...