Как добавить индексы - PullRequest
       8

Как добавить индексы

1 голос
/ 30 апреля 2019

У меня есть следующий код:

indices_to_remove= []
for i in range(0,len(df)):
        if (df.speed.values[i] <= 15 ):
            counter += 1
            if counter > 600:
               indices_to_remove.append(i)        

        else:
            counter= 0

df= df.drop (indices_to_remove, axis=0)

Основная цель этого кода - циклически проходить по всем строкам в моем наборе данных, и в случае, если имеется более 600 последовательных строк, имеющих значение скоростименьше 15. Код добавит индексы строк в indices_to_remove, после чего все эти строки будут удалены.

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Вы пытаетесь сделать две вещи параллельно, получая индексы для удаления, а также подсчитывает 600 последовательных значений, которые меньше 15. Я бы разделил эти две идеи на два шага.

  1. Найти все индексы, для которых значения меньше 15
  2. После этого подсчитать индексы, которые являются последовательными
  3. Если у нас более 600 таких индексов, выполните удаление
indices_to_remove= []

#Get all indexes to remove from the dataframe
for i in range(0,len(df)):
    if (df.speed.values[i] <= 15 ):
        indices_to_remove.append(i)

#Have a counter which keeps track of 600 consecutive indexes less than 15
counter = 0
max_counter = -1
for idx in range(len(indices_to_remove)-1):

    #If the indexes were consecutive, keep a counter
    if ((indices_to_remove[idx+1] - indices_to_remove[idx]) == 1):
        counter += 1

    #Else if non consecutive indexes are found, track the last maximum counter and reset the original counter
    else:
        if counter > max_counter:
            max_counter = counter
        counter = 0

if max_counter > 600:
    df = df.drop(indices_to_remove, axis=0)
0 голосов
/ 30 апреля 2019

Создать словарь индексов, где последовательная скорость меньше или равна 15.

indices_dict = {}
k = 0
for i in range(0, len(df)):
    if (df.speed.values[i] <= 15 ):
        try:
            indices_dict[k].append(i)
        except KeyError:
            indices_dict[k] = [i]
    else:
        k += 1

lol_to_remove = [ v for k,v in indices_dict.items() if len(v)>= 600 ] # This is a list of lists (lol)
indices_to_remove = [i for v in lol_to_remove for i in v ] # flatten the list

df = df.drop(indices_to_remove, axis=0)
0 голосов
/ 30 апреля 2019

Не элегантное решение, но опираясь на то, что у вас есть:

indices_to_remove= []
indices_counter = []
for i in range(0,len(df)):

        if (df.speed.values[i] <= 15 ):
            counter += 1

            indices_counter.append(i)

            if counter > 600:
                commit = True

        elif commit:
            indices_to_remove.extend(indices_counter)
            indices_counter = []
            commit = False
            counter= 0

        else:
            indices_counter = []
            commit = False
            counter= 0

df= df.drop(indices_to_remove, axis=0)
...