Как извлечь последние 3 номера индексов перед определенной категорией - PullRequest
1 голос
/ 23 июня 2019

ОБНОВЛЕНИЕ

У меня есть следующий набор данных, и я хочу получить список, который включает последние три индекса перед меткой «ДА».Мой набор данных:

i            category
0               NO
1               NO
2               NO
3               NO
4               NO
5               YES
6               YES
7               YES
8               NO
9               NO
10              NO
11              YES
12              YES

Я ожидаю, что результат будет:

список = [2,3,4,8,9,10]

Пожалуйстаобратите внимание, что ДА обычно происходят в последовательном диапазоне образцов (2-6 образцов).Я хочу получить последние три индекса перед первым YES в диапазоне.

PS: набор данных был сохранен в CSV-файле, и я импортировал с помощью pandas

Ответы [ 3 ]

2 голосов
/ 23 июня 2019

Вероятно, не самый питонический способ, но я не мог придумать, как сделать это без цикла for и некоторой нарезки, похоже на хакерский метод:

a = df[((df.category.ne(df.category.shift()))==True) & (df.category == 'YES')].index


indices = []
for x in a:
    indices.append(df.iloc[slice(max(0, x-3), min(x, len(df)))])
new_df = pd.concat(indices) # if you wanted this as a df.

list(new_df.index)


[2, 3, 4, 8, 9, 10]
1 голос
/ 24 июня 2019

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

второй цикл - просто сгладить двойной список из списка результатов.

li= ['1','2','3','4','YES','6','7','8','9','0','YES']
result = []
for x in range(len(li)):
  if li[x] is 'YES':
    result.append(li[x-3:x])


final= []
for x in result:
  for y in x:
    final.append(y)

final = ['2 ',' 3 ',' 4 ',' 8 ',' 9 ',' 0 ']

1 голос
/ 23 июня 2019

Предположим, как вы указали в своем комментарии, что перед каждым ДА всегда есть как минимум 3 пункта. Возможное решение будет

import pandas as pd

flatten = lambda l: [item for sublist in l for item in sublist]

df = pd.DataFrame({"category":['NO', 'NO', 'NO', 'NO', 'NO',
                               'YES', 'NO', 'NO', 'NO', 'NO',
                               'NO','YES','NO']})
# take only indices where YES occurs
idx = df[df["category"]=="YES"].index

# for every i in idx take the previuos 3 indices
lst = [list(range(i-3, i)) for i in idx]

# flatten lst
lst = flatten(lst)
...