Пожалуйста, дайте мне знать, если название моей проблемы является точным - я думаю, что мне нужно зацикливание оператора if для решения проблемы ниже - я новичок в Python и программировании в целом, поэтому не знаю, если терминологияправильно.
Я использую Spyder, работаю над исследовательским проектом.
Мне нужно создать новую переменную в существующем фрейме данных (df), которая обеспечивает следующую логику:
Между временем T1 (1-е вхождение числа 1 в столбце e1) и временем T2 (2-е 1 в e1), если для любой из переменных записан 1 между T1 и T2(e2 или e3) или значение v1 между T1 и T2 больше 1, затем поместите 1 в новый столбец с именем 'result' между T1 и T2.
Между временем T2 (2-е вхождение числа 1 в столбце e1) и временем T3 (3-е 1 в e1), если существует запись 1 между T2 и T3 для любой из переменных (e2 или e3) или значение v1 между T2 и T3 является большимбольше 1, затем поместите 1 в новый столбец с именем «result» между T2 и T3.
между T3 и T4 и т. д. и т. д.
Следуя вышесказанному, я создам подмножество данных, основанное на всех строках, которые имеют «1» в «результате» для дальнейшего анализа.
Чтобы воссоздать небольшую часть df:
import pandas as pd
import numpy as np
import datetime
df = pd.DataFrame({'e1' : [1,np.nan,np.nan,1,np.nan,1,np.nan,np.nan,1,np.nan,np.nan,1,np.nan],
'e2' : [np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
'e3' : [np.nan,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
'v1' : [1,1,1,1,1,1,1,1,1,1.2,1.5,1,1],},
index=pd.date_range('2019-05-02T00:00:00', '2019-05-02T01:00:00', freq='5T'))
Результат должен быть:
'result' : [1,1,1,1,1,np.nan,np.nan,np.nan,np.nan,1,1,np.nan,np.nan]
Надеюсь, это имеет смысл.
Спасибо!
Редактировать 31.05.2019
Предлагаемое решение работает в большинстве случаев, однако критически не дает результатов:
Я отредактировал данные выборки, включив в них экземпляр, в котором есть наблюдения как на e1, так и на e2 в 00:25:00..
import pandas as pd
import numpy as np
import datetime
df = pd.DataFrame({'e1' : [1,np.nan,np.nan,1,np.nan,1,np.nan,np.nan,1,np.nan,np.nan,1,np.nan],
'e2' : [np.nan,1,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
'e3' : [np.nan,np.nan,np.nan,np.nan,1,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]},
index=pd.date_range('2019-05-02T00:00:00', '2019-05-02T01:00:00', freq='5T'))
Проблема
Проблема, с которой я столкнулся, заключается в том, что предлагаемое решение сообщает о результате в период с 00:25:00 до 00:40:00,где я хочу, чтобы результат не включал это.Я хочу, чтобы код анализировал время между 1 в столбце e1, не считая времени наблюдения в e1.
Надеюсь, это имеет смысл ...