Создать столбец на основе наличия дат в определенном диапазоне в нескольких других столбцах - PullRequest
0 голосов
/ 03 января 2019

У меня есть фрейм данных с именем df, который выглядит примерно так (за исключением того, что число столбцов 'Посетить' достигает Visit_74, а число клиентов составляет несколько сотен - я упростил его здесь).

Client    Visit_1     Visit_2     Visit_3     Visit_4     Visit_5         
Client_1  2016-05-10  2016-05-25  2016-06-10  2016-06-25  2016-07-10
Client_2  2017-05-10  2017-05-25  2017-06-10  2017-06-25  2017-07-10
Client_3  2018-09-10  2018-09-26  2018-10-10  2018-10-26  2018-11-10  
Client_4  2018-10-10  2018-10-26  2018-11-10  2018-11-26  2018-12-10

Я хочу создать новый столбец с именем Four_Visits с двумя значениями 0 и 1. Я хочу установить Four_Visits равным 1, если в любом из столбцов от Visit_1 до Visit_5, которые находятся между 2018-10-15 и 2018-12-15, есть хотя бы четыре даты. Результирующий кадр данных должен выглядеть следующим образом:

Client    Visit_1     Visit_2     Visit_3     Visit_4     Visit_5     Four_Visits  
Client_1  2016-05-10  2016-05-25  2016-06-10  2016-06-25  2016-07-10  0
Client_2  2017-05-10  2017-05-25  2017-06-10  2017-06-25  2017-07-10  0
Client_3  2018-09-10  2018-09-26  2018-10-10  2018-10-26  2018-11-10  0
Client_4  2018-10-10  2018-10-26  2018-11-10  2018-11-26  2018-12-10  1  

1 Ответ

0 голосов
/ 03 января 2019

Преобразовать в datetime, если еще нет, затем использовать фильтр и >= + <=, чтобы проверить, попадают ли более 4 столбцов посещений между датами для каждой строки:

import pandas as pd
# df = df.set_index('Client').apply(pd.to_datetime).reset_index()

df['Four_Visits'] = ((df.filter(like='Visit').ge(pd.to_datetime('2018-10-15')).fillna(0).astype(bool))
                     & (df.filter(like='Visit').le(pd.to_datetime('2018-12-15')).fillna(0).astype(bool))
                    ).sum(1).ge(4).astype('int')

Вывод:

     Client    Visit_1    Visit_2    Visit_3    Visit_4    Visit_5  Four_Visits
0  Client_1 2016-05-10 2016-05-25 2016-06-10 2016-06-25 2016-07-10            0
1  Client_2 2017-05-10 2017-05-25 2017-06-10 2017-06-25 2017-07-10            0
2  Client_3 2018-09-10 2018-09-26 2018-10-10 2018-10-26 2018-11-10            0
3  Client_4 2018-10-10 2018-10-26 2018-11-10 2018-11-26 2018-12-10            1
...