Создайте новый столбец, который будет суммой числа дат в нескольких других столбцах, которые удовлетворяют двум условиям - PullRequest
2 голосов
/ 18 апреля 2019

У меня есть датафрейм, который выглядит примерно так (за исключением того, что количество столбцов Visit и Deliv увеличивается до Visit_84 и Deliv 84, и есть несколько сотен клиентов - я упростил это здесь)

Client   Visit_1    Visit_2    Visit_3    Deliv_1  Deliv_2  Deliv_3 Key_DT
Client_1 2018-01-01 2018-01-20 2018-02-10 No       Yes      Yes     2018-01-15
Client_2 2018-01-10 2018-01-30 2018-02-10 Yes      Yes      No      2018-01-25
Client_3 2018-01-20 2018-04-01 2018-04-10 Yes      Yes      Yes     2018-04-15
Client_4 2018-01-30 2018-03-01 2018-03-10 Yes      No       Yes     2018-02-25

Я хочу создать новый столбец с именем Vis_sum, который показывает сумму количества посещений от Visit_1 до Visit_3, которые идут после Key_DT в той же строке и имеют Yes в связанный столбец Deliv (например, Deliv_1 связан с Visit_1). Это должно выглядеть так

Client   Visit_1    Visit_2    Visit_3    Deliv_1  Deliv_2  Deliv_3 Key_DT     Vis_sum
Client_1 2018-01-01 2018-01-20 2018-02-10 No       Yes      Yes     2018-01-15 2
Client_2 2018-01-10 2018-01-30 2018-02-10 Yes      Yes      No      2018-01-25 1
Client_3 2018-01-20 2018-04-01 2018-04-10 Yes      Yes      Yes     2018-04-15 0
Client_4 2018-01-30 2018-03-01 2018-03-10 Yes      No       Yes     2018-02-25 1

Ответы [ 2 ]

2 голосов
/ 18 апреля 2019

Предполагается, что все ваши столбцы datetime.Если это не так, преобразуйте их.


Настройка

a = df.filter(like='Visit').values
b = df.filter(like='Deliv').eq('Yes').values
c = df['Key_DT'].values

Использование сравнения с вещанием

((a > c[:, None]) & b).sum(1)

array([2, 1, 0, 1])

df.assign(Vis_sum=((a > c[:, None]) & b).sum(1))

     Client    Visit_1    Visit_2    Visit_3 Deliv_1 Deliv_2 Deliv_3     Key_DT  Vis_sum
0  Client_1 2018-01-01 2018-01-20 2018-02-10      No     Yes     Yes 2018-01-15        2
1  Client_2 2018-01-10 2018-01-30 2018-02-10     Yes     Yes      No 2018-01-25        1
2  Client_3 2018-01-20 2018-04-01 2018-04-10     Yes     Yes     Yes 2018-04-15        0
3  Client_4 2018-01-30 2018-03-01 2018-03-10     Yes      No     Yes 2018-02-25        1
0 голосов
/ 18 апреля 2019

Вот подход np:

deliv_cols = [col for col in df.columns if 'Deliv' in col]
visit_cols = [col for col in df.columns if 'Visit' in col]

flags = df[deliv_cols].apply(lambda x: x.str.contains('Y'))
date_flags = df[visit_cols].apply(lambda x: x>df.Key_DT)

df['Vis_sum'] = np.sum(flags.values & date_flags.values,axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...