创建一个新列,它是满足两个条件的多个其他列中的日期数之和

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建一个新列,它是满足两个条件的多个其他列中的日期数之和相关的知识,希望对你有一定的参考价值。

我有一个类似于此的数据框(除了VisitDeliv列的数量上升到Visit_84Deliv 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_1Visit_3的访问次数之和,该次数来自同一行中的Key_DT,并且在相关的Yes列中有Deliv(例如Deliv_1Visit_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
答案

这假设您的所有列都是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
另一答案

这是一个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)

以上是关于创建一个新列,它是满足两个条件的多个其他列中的日期数之和的主要内容,如果未能解决你的问题,请参考以下文章

R中有没有办法创建一个新列,根据其他列分配值? [复制]

根据 R 中的条件包含满足条件创建一个新列

如何将列中的所有数据移动到单个列(不合并),然后拆分为R中的新列?

如何根据一个数据帧中的列值和R中另一个数据帧的列标题名称有条件地创建新列

在其他列中选择满足多个条件的列值

使用Spark中的复杂条件和滞后自引用创建新列