我有一个与此类似的数据框(除了 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
位于同一行,并且在关联的 Deliv
列中具有 Yes
(例如 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
最佳答案
这假设您的所有列都是日期时间
。如果不是,请将它们转换。
设置
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
关于python - 创建一个新列,该新列是满足两个条件的多个其他列中的日期数之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55750372/