#python #pandas
Вопрос:
У меня есть следующие примеры данных, в которых есть столбцы даты и значения. Столбец cross_date_since-это мой ожидаемый результат. Значение value находится в диапазоне от 0 до 1. Если значение выше/ниже 0,5, cross_date_since должен быть его первой датой пересечения вверх/вниз.
Для этого я попытался использовать apply() и loop-and-loop. Они работают, но очень медленно, если данные большие. Есть ли какой-либо эффективный способ решить эту проблему?
date value *cross_date_since*
2021-07-01 0.48 2021-07-01
2021-07-02 0.88 2021-07-02
2021-07-03 0.7 2021-07-02
2021-07-04 0.65 2021-07-02
2021-07-05 0.46 2021-07-05
2021-07-06 0.22 2021-07-05
2021-07-07 0.32 2021-07-05
2021-07-08 0.33 2021-07-05
2021-07-09 0.54 2021-07-09
2021-07-10 0.66 2021-07-09
2021-07-11 0.65 2021-07-09
2021-07-12 0.75 2021-07-09
...
Ответ №1:
Узнайте перекрестную дату и сначала заполните соответствующие значения, а затем выполните прямое заполнение с ffill
:
df.loc[df.value.gt(0.5).diff().fillna(True), 'cross_date_since'] = df.date
df
# date value cross_date_since
#0 2021-07-01 0.48 2021-07-01
#1 2021-07-02 0.88 2021-07-02
#2 2021-07-03 0.70 NaN
#3 2021-07-04 0.65 NaN
#4 2021-07-05 0.46 2021-07-05
#5 2021-07-06 0.22 NaN
#6 2021-07-07 0.32 NaN
#7 2021-07-08 0.33 NaN
#8 2021-07-09 0.54 2021-07-09
#9 2021-07-10 0.66 NaN
#10 2021-07-11 0.65 NaN
#11 2021-07-12 0.75 NaN
df.cross_date_since.ffill(inplace=True)
df
# date value cross_date_since
#0 2021-07-01 0.48 2021-07-01
#1 2021-07-02 0.88 2021-07-02
#2 2021-07-03 0.70 2021-07-02
#3 2021-07-04 0.65 2021-07-02
#4 2021-07-05 0.46 2021-07-05
#5 2021-07-06 0.22 2021-07-05
#6 2021-07-07 0.32 2021-07-05
#7 2021-07-08 0.33 2021-07-05
#8 2021-07-09 0.54 2021-07-09
#9 2021-07-10 0.66 2021-07-09
#10 2021-07-11 0.65 2021-07-09
#11 2021-07-12 0.75 2021-07-09
Комментарии:
1. Я даже не знаю, как использовать этот метод, который может передавать последнее значение. У меня и раньше были подобные проблемы, и я использовал для этого глупую логику. Огромное спасибо. Большое подспорье для меня.