С операторами if-else вы можете использовать np.select
для реализации своей логики.Также проверка df.RUNNING_DATE.isna()==False
является излишней;просто используйте df.RUNNING_DATE.notnull()
.
Далее, логика здесь может быть упрощена очень .
- Любое
>=
, ==
или <=
сравнение дат с NaT
вернет False
, поэтому сначала проверяйте, является ли значение конечным, не нужным, когда уже проверяете, является ли RUNNING_DATEбольше.Также любое сравнение NaT
с NaT
возвращает False
, что дает нам проверку по умолчанию, если RUNNING_DATE имеет значение null. - Поскольку проверки даты охватывают весь диапазон возможностей, просто последовательно проверяйте
>=
.
Код
import pandas as pd
import numpy a np
# Ensure Datetime
#df['RUNNING_DATE'] = pd.to_datetime(df.RUNNING_DATE, errors='coerce')
#df['D1_UNTIL'] = pd.to_datetime(df.D1_UNTIL, errors='coerce')
#df['D2_UNTIL'] = pd.to_datetime(df.D2_UNTIL, errors='coerce')
#df['D3_UNTIL'] = pd.to_datetime(df.D3_UNTIL, errors='coerce')
conds = [
df.RUNNING_DATE >= df.D3_UNTIL,
df.RUNNING_DATE >= df.D2_UNTIL,
df.RUNNING_DATE >= df.D1_UNTIL]
choices = [
df.DVAL3,
df.DVAL2,
df.DVAL1]
df['RESULT'] = np.select(conds, choices, default=None)
Вывод:
(я добавил дополнительные строки в конце, чтобы проиллюстрировать логику)
RUNNING_DATE D1_UNTIL DVAL1 D2_UNTIL DVAL2 D3_UNTIL DVAL3 RESULT
0 2018-01-01 2018-01-01 10.0 NaT NaN NaT NaN 10
1 2018-01-02 NaT NaN NaT NaN NaT NaN None
2 2018-01-03 2018-01-01 NaN NaT NaN NaT NaN NaN
3 2018-01-04 2018-01-01 10.0 2018-01-03 15.0 NaT NaN 15
4 2018-01-05 2018-01-01 10.0 2018-01-03 20.0 2018-01-31 100.0 20
5 2018-01-06 2018-01-01 10.0 NaT 999.0 NaT NaN 10
6 2018-01-07 2018-01-01 10.0 2018-01-04 25.0 2018-01-06 300.0 300
7 NaT NaT NaN NaT NaN NaT NaN None
8 NaT NaT NaN 2018-01-01 24.0 NaT NaN None