Создание групп на основе множественного сравнения DateTime - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь создать столбец на основе и заполнить его значением на основе сравнения одного столбца даты с тремя другими столбцами даты.

Пример DataFrame df показан ниже. Все показанные даты уже конвертированы в pd.to_datetime, что привело к значению NaT значений, так как индивидуум не прогрессировал

    1st_date     2nd_date        3rd_date     action_date
    2015-10-05   NaT             NaT          2015-12-03 
    2015-02-27   2015-03-14      2015-03-15   2015-04-08 
    2015-03-07   2015-03-27      2015-03-28   2015-03-27 
    2015-01-05   2015-01-20      2015-01-21   2015-05-20 
    2015-01-05   2015-01-20      2015-01-21   2015-09-16 
    2015-05-23   2015-06-18      2015-06-19   2015-07-01 
    2015-03-03   NaT             NaT          2015-07-23 
    2015-03-03   NaT             NaT          2015-11-14 
    2015-06-05   2015-06-19      2015-06-20   2015-10-24 
    2015-10-08   2015-10-21      2015-10-22   2015-12-22 

Я пытаюсь создать пятый столбец, содержащий результат (или группу) сравнения столбца action_date с тремя предыдущими столбцами даты 1st_date, 2nd_date, 3rd_date.

Я пытаюсь заполнить пятый столбец с именем action_group строкой, назначающей каждой дате группу.

Псевдокод для потенциальной функции (и ожидаемого выхода) имеет вид: if action_date > 1st_date and < 2nd_date then action_group = '1st_action_group'

Такое же сравнение необходимо для action_date, 2nd_date и 3rd_date, что приведет к выводу 2nd_action_group в столбце action_group.

Наконец, если action_date больше 3rd_date, action_group будет присвоено значение 3rd_action_group.

Пример ожидаемого результата показан ниже.

1st_date     2nd_date        3rd_date     action_date  action_group
2015-10-05   NaT             NaT          2015-12-03   1st_action_group
2015-02-27   2015-03-14      2015-03-15   2015-04-08   3rd_action_group
2015-03-07   2015-03-27      2015-03-28   2015-03-27   2nd_action_group
2015-01-05   2015-01-20      2015-01-21   2015-05-20   3rd_action_group
2015-01-05   2015-01-20      2015-01-21   2015-09-16   3rd_action_group
2015-05-23   2015-06-18      2015-06-19   2015-07-01   3rd_action_group
2015-03-03   NaT             NaT          2015-07-23   1st_action_group
2015-03-03   NaT             NaT          2015-11-14   1st_action_group
2015-06-05   2015-06-19      2015-06-20   2015-10-24   3rd_action_group
2015-10-08   2015-10-21      2015-10-22   2015-12-22   3rd_action_group

Буду очень признателен за любую помощь, которую сможет оказать любой.

1 Ответ

1 голос
/ 04 июня 2019
df['action_group'] = np.where(df['action_date']>df['3rd_date'], 
                              '3rd_action_group', 
                               np.where(((df['action_date'] >= df['2nd_date'])&(df['action_date']<df['3rd_date'])), 
                                          '2nd_action_group', 
                                          '1st_action_group'))

Вы можете просто сложить 2 np.where для получения желаемых результатов.

    1st_date    2nd_date    3rd_date    action_date action_group
0   2015-10-05     NaT          NaT     2015-12-03  1st_action_group
1   2015-02-27  2015-03-14  2015-03-15  2015-04-08  3rd_action_group
2   2015-03-07  2015-03-27  2015-03-28  2015-03-27  2nd_action_group
3   2015-01-05  2015-01-20  2015-01-21  2015-05-20  3rd_action_group
4   2015-01-05  2015-01-20  2015-01-21  2015-09-16  3rd_action_group
5   2015-05-23  2015-06-18  2015-06-19  2015-07-01  3rd_action_group
6   2015-03-03     NaT          NaT     2015-07-23  1st_action_group
7   2015-03-03     NaT          NaT     2015-11-14  1st_action_group
8   2015-06-05  2015-06-19  2015-06-20  2015-10-24  3rd_action_group
9   2015-10-08  2015-10-21  2015-10-22  2015-12-22  3rd_action_group
...