Используйте:
# STEP 1
df['Date_To'] = pd.to_datetime(df['Date_To'])
df['Date_From'] = pd.to_datetime(df['Date_From'])
# STEP 2
df['count'] = np.arange(df.shape[0])
# STEP 3
m1 = df['Date_From'].sub(df['Date_To'].shift()).dt.days.eq(1)
# STEP 4
m2 = df['count'].eq(df.groupby(level=0)['count'].transform('first'))
# STEP 5
df1 = df.assign(CHECK_CONDITION=np.where(m1 | m2, 'OK', 'WARNING')).drop('count', 1)
Объяснение:
ШАГ 1: Используйте pd.to_datetime
, чтобы преобразовать столбец Date_To
& Date_From
в pandas datetime series.
ШАГ 2: Используйте np.arange
для создания временного столбца count
в df
, который действует как уникальный счетчик для строк в кадре данных, это помогает отслеживать граничные условия, которые могут поможет отличить следующего сотрудника от предыдущего в отсортированном фрейме данных.
# df
Date_From Date_To PROPOSAL_REASON count
PERSON_NUMBER
3720081000 2008-01-04 2009-12-07 MEINC 0
3720081000 2018-07-01 2019-03-31 MEINC 1
3720081000 2019-04-01 2019-10-31 MEINC 2
3720081018 2018-07-01 2019-03-31 MEINC 3
3720081018 2019-04-01 2019-10-31 MEINC 4
3720081077 2018-07-01 2019-03-31 MEINC 5
3720081111 2019-04-01 2019-10-31 MEINC 6
3720081211 2018-07-01 2019-03-31 MEINC 7
3720081211 2019-06-01 2019-10-31 MEINC 8
ШАГ 3: Создайте логическую маску m1
, вычтя «Date_From» из смещенного столбца «Date_To», затем используйте Series.dt.days
, чтобы получить количество дней между двумя столбцами, затем используйте Series.eq
, чтобы создать логическую маску, где истинные значения соответствуют условию, когда общее количество дней равно 1
.
# m1
PERSON_NUMBER
3720081000 False
3720081000 False
3720081000 True
3720081018 False
3720081018 True
3720081077 False
3720081111 True
3720081211 False
3720081211 False
dtype: bool
ШАГ 4: Создайте логическую маску m2
, используя Series.eq
и DataFrame.groupby
на level=0
, где истинные значения соответствуют граничному условию идентификатора сотрудника .
# m2
PERSON_NUMBER
3720081000 True
3720081000 False
3720081000 False
3720081018 True
3720081018 False
3720081077 True
3720081111 True
3720081211 True
3720081211 False
Name: count, dtype: bool
ШАГ 5: Используйте np.where
для выбора скалярных значений из OK
и WARNING
на основе условий m1 | m2
:
# df1 (RESULT)
Date_From Date_To PROPOSAL_REASON CHECK_CONDITION
PERSON_NUMBER
3720081000 2008-01-04 2009-12-07 MEINC OK
3720081000 2018-07-01 2019-03-31 MEINC WARNING
3720081000 2019-04-01 2019-10-31 MEINC OK
3720081018 2018-07-01 2019-03-31 MEINC OK
3720081018 2019-04-01 2019-10-31 MEINC OK
3720081077 2018-07-01 2019-03-31 MEINC OK
3720081111 2019-04-01 2019-10-31 MEINC OK
3720081211 2018-07-01 2019-03-31 MEINC OK
3720081211 2019-06-01 2019-10-31 MEINC WARNING