Вот (если я правильно понимаю) решение:
import numpy as np
df['C'] = np.where(df.A > df.B, df.index, np.nan).bfill().shift(-1)
df['X'] = (df.A > df.B).cumsum()
df = df.drop_duplicates(subset=['X'], keep='first')
df = df[['C']]
Сначала мы заполняем столбец с именем C
меткой времени строк, в которых выполняется условие, и помещаем NaN
в другом месте.Мы засыпаем его так, чтобы все предыдущие строки имели одинаковую метку времени (вплоть до той, где условие было выполнено в последний раз).Затем мы сдвигаемся назад на одну строку (чтобы подготовиться к следующему шагу).
Чтобы индексы выровнялись так, как вы хотите, нам нужно сгруппировать строки.Мы можем сделать это, комбинируя ваше состояние и cumsum()
, который обрабатывает True
как 1
и False
как 0
.Теперь мы можем отбросить все строки в группе (которые имеют одинаковую метку времени в C
), кроме первой.Это должно дать вам нужный вам вывод.
Примечание: ваш желаемый вывод не совпадает с вашим вводом (при 2/4/18 0:03
, B
больше, чем не меньше, A
)поэтому ответ не соответствует вашему примеру.Но я думаю, что я понял, что вы спрашиваете - если я прав, пожалуйста, исправьте вопрос, и если я не прав, прокомментируйте, и я изменю свой ответ.