выбор условия сопоставления строк, а также одной строки выше и одной строки ниже

#python #pandas #indexing #slice

#python #pandas #индексирование #срез

Вопрос:

Я пытаюсь выбрать строки в фрейме данных, которые соответствуют условию, а также строки непосредственно перед ним и сразу после него (даже если эти строки не соответствуют условию.)

Условие заключается в том, что значение в df[‘col1’] меньше 100

 idx=df.index[df['col1']<100]
  

df.loc[idx] дает мне все строки, соответствующие условию df[‘col1’]<100

Чтобы также получить одну строку выше и одну строку ниже, я попытался срезать, используя df.iloc[idx-1:idx 1] но я получаю сообщение об ошибке

Ошибка типа: невозможно выполнить индексацию фрагмента в <классе ‘pandas.core.indexes.numeric.Int64Index’> с помощью этих индексаторов [Int64Index([ 23362, 23363, 23364, 23365, 23366, 23367, 23368, 23369, 23370, 23371, … 129089, 129154, 129155, 129156, 129157, 129158, 129159, 129160, 129161, 129162], dtype=’int64′, длина= 7851)] из <класса ‘pandas.core.indexes.numeric.Int64Index’>

Ответ №1:

У вас уже есть bool, поэтому не нужно фильтровать его по index , мы можем сделать shift для маски

 m = df['col1']<100
df = df[m.shift(-1)|m.shift()|m]
  

Комментарии:

1. О, вау, да. Это сработало. (Я использовал ~ , потому что на самом деле хочу удалить строки, соответствующие условию) df=df.loc[~(mask.shift(-1)|mask.shift( 1)|mask)] Кстати, каковы ваши рекомендации относительно того, когда использовать маску, а когда использовать индекс и loc?