#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?