Есть ли способ итеративно найти индекс кадра данных, когда столбец удовлетворяет определенному условию, основанному на другом столбце? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть кадр данных pandas с ReadTime в качестве индекса следующим образом:

  ReadTime    A       B
2/4/18 0:00 6008.6  6013.55
2/4/18 0:01 6008.65 6013.6
2/4/18 0:02 6009.15 6014.05
2/4/18 0:03 6014.00 6014.1
2/4/18 0:04 6009.1  6013.7
2/4/18 0:05 6008.75 6013.65
2/4/18 0:06 6008.7  6013.25
2/4/18 0:07 6008.3  6013.25
2/4/18 0:08 6015.00 6013
2/4/18 0:09 6008.3  6003.55
2/4/18 0:10 6008.65 6013.65
2/4/18 0:11 6008.75 6013.6
2/4/18 0:12 6008.7  6013.7
2/4/18 0:13 6008.65 6013.55
2/4/18 0:14 6014.00 6013.3
2/4/18 0:15 6008.6  6013.5
2/4/18 0:16 6008.55 6013.4
2/4/18 0:17 6008.55 6013.55
2/4/18 0:18 6008.65 6013.55
2/4/18 0:19 6018    6013.6

Я хотел бы проверить, многократно ли значения в A больше или равны значениям в B, и создать новый кадр данных с отметкой времени вчто это случилось.Повторите анализ с отметкой времени, в которой было выполнено предыдущее условие.

Примеры результатов:

  ReadTime      C
2/4/18 0:00 2/4/18 0:03
2/4/18 0:03 2/4/18 0:08
2/4/18 0:08 2/4/18 0:14
2/4/18 0:14 2/4/18 0:19

Спасибо за помощь заранее.

Редактировать: В столбце C указывается временная метка, при которой условие было выполнено.(т. е. значение в A было больше или равно значению в B, учитывая значение в отметке времени. Например, в 2/4/18 0:00 значение B составляло 6013,55. Таким образом, переходя к значениям в A после этой отметки времени,мы можем видеть, что в 04.02.18 0:03 значение А было 6014, что превысило значение В (6013,55). Таким образом, 2/4/18 0:03 было перенесено в С, что соответствует 2/4 /18 0:00.

1 Ответ

0 голосов
/ 23 октября 2018

Вот (если я правильно понимаю) решение:

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)поэтому ответ не соответствует вашему примеру.Но я думаю, что я понял, что вы спрашиваете - если я прав, пожалуйста, исправьте вопрос, и если я не прав, прокомментируйте, и я изменю свой ответ.

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