Чтобы иметь некоторую не очищенную область также после «диапазона очистки», я расширил ваш DataFrame на одну строку, поэтому он содержит:
Day IR Shift
0 May/30/2019 5.9% 1.67%
1 May/29/2019 6% 1.69%
2 May/28/2019 5.9% -292%
3 May/27/2019 20.2% -1.4%
4 May/26/2019 20.5% 2.5%
5 May/25/2019 20% 292%
6 May/24/2019 5.1% 2%
7 May/23/2019 5.0% -
А теперь, как решить проблему:
Сначала определите функцию, определяющую начало и конец «диапазона очистки», на основе 2 вспомогательных столбцов, которые вскоре будут созданы:
def detect(row):
if row.Shft1 < -50:
detect.retVal = True
elif row.Shft2 > 50:
detect.retVal = False
return detect.retVal
Затем вычислите эти 2 вспомогательных столбца:
df['Shft1'] = df.Shift.apply(lambda x: 0.0 if x == '-' else float(x.rstrip('%')))
df['Shft2'] = df.Shft1.shift(fill_value=0)
Фактические вычисления включают следующий код:
detect.retVal=False
df.IR.mask(df.apply(detect, axis=1), np.nan, inplace=True)
Считывание приведенного выше кода начинается с df.apply(detect, axis=1)
.Эта инструкция вычисляет маску, указывая строки, в которых значение IR
должно быть очищено (заменено на NaN ).
Затем перейдите к самой функции mask
.Он применяется к столбцу df.IR
, используя только вычисленную маску, таким образом очищая указанные строки.
И последний шаг - удалить оба вспомогательных столбца:
df.drop(columns=['Shft1', 'Shft2'], inplace=True)
В результате получается:
Day IR Shift
0 May/30/2019 5.9% 1.67%
1 May/29/2019 6% 1.69%
2 May/28/2019 NaN -292%
3 May/27/2019 NaN -1.4%
4 May/26/2019 NaN 2.5%
5 May/25/2019 NaN 292%
6 May/24/2019 5.1% 2%
7 May/23/2019 5.0% -