Как отбросить строки, которые: 1) соответствуют определенным критериям и 2) количество последовательных строк велико? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь установить определенное условие и сосчитать последовательные строки, которые удовлетворяют этому условию, и если число> 100. Я не хочу отбрасывать все строки, но сохранить первые 10 и последние 10 строк и удалить все между ними (в данном случае 80 строк). С другой стороны, если число <100, ни одна строка не будет удалена </p>

count = 0

for i in range (len(df.speed)):
   if (df.speed.values [i] <= 15 ):
       count += 1


       if count > 100: 

выборочные данные и ожидаемый результат

i     speed
0       12
1       11 
2       9
.       . 
.       .
120     14
121     18
122     19
123     12
124     10
.       .
.       . 
.       .
180     12
181     19

поскольку индексы от 0 до 120 имеют меньшую скорость, чем 5, счетчик должен начинаться с i = 0 и заканчиваться на i = 120, а поскольку count> 100, алгоритм должен сохранять индекс от 0 до 9 (10 строк ) и я между 111 и 120 (10 строк) и все строки между ними должны быть удалены. В следующем случае, поскольку i = 123 имеет скорость меньше 15, счетчик должен начать новый отсчет с i = 123, и он остановится при i = 180 и, поскольку count <100. тогда никакие строки не должны быть отброшены. </p>

В основном я застрял в том, как удалить строки, которые находятся посередине, и сохранить первые и последние 10 строк. Был бы признателен, если кто-то может дать подсказку. Спасибо

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Я не дам вам полный ответ, но два предложения.

Во-первых, чтобы отслеживать последние 10 строк, скопируйте их все в кольцевой буфер. Вы можете использовать список:

final_rows[i % 10] = input

Если у вас более 10 строк, последние 10 будут записаны в ваш буфер. Когда придет время их выписать,

 i += 1
 for j in range(len(final_rows)):
      output( final_rows[ (i + j) % 10 ] )

Во-вторых, если вы можете выполнить «резервное копирование», вы можете «удалить» выходные строки после их записи, запомнив, где начался 11-й вывод, и записав последние 10 строк, начинающиеся там. Например:

if i == 10: # 11th, starting from 0
   pos = f.tell()
if is_last_row and i > 100:
   f.seek(pos, 0)
   i += 1
   for j in range(len(final_rows)):
      output( final_rows[ (i + j) % 10 ] )
0 голосов
/ 29 апреля 2019

Похоже, это хорошее место для цикла while для сбора локусов DF, которые вы хотите сохранить. Вы можете объединить эти локусы с позициями [0:10] и [-10:]. Только не забудьте дедупликации, чтобы избавиться от любого совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...