首页 > 解决方案 > 如何创建一个新列,该列是特定范围内满足多个条件的列数的总和

问题描述

.我有一个看起来与此类似的数据框(除了VisitDeliv列的数量上升到Visit_12并且Deliv 12有数百个客户端 - 我在这里简化了它)

Client   Visit_1    Visit_2    Visit_3    Deliv_1  Deliv_2  Deliv_3 Key_DT
Client_1 2018-01-01 2018-01-20 2018-03-29 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
Client_5 2018-04-02 2018-04-07 2018-04-20 Yes      No       Yes     2018-04-01

我想创建一个名为的新列Vis_sum,该列显示,对于所有具有Key_DTafter2018-01-20但 before的客户2018-03-25,访问次数的总和Visit_1Visit_3i)Key_DT在同一行中,(ii)在之前2018-03-25和(iii)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-03-29 No       Yes      Yes     2018-01-15 0
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
Client_5 2018-04-02 2018-04-07 2018-04-20 Yes      No       Yes     2018-04-01 0

请注意 - 所有列中都缺少数据,因此必须考虑到这一点。

我尝试了以下方法 - 但没有奏效。虽然 (i) 和 (ii) 部分的代码在一起尝试时工作,而 (iii) 的代码单独工作,但当编写以下所有代码时,它会0为列中的每一行返回Vis_sum

df.loc[((df.Key_DT < '2018-03-25') & (df.Key_DT >= '2018-01-20')), 'Vis_sum'] = ((df.filter(like='Visit_').gt(df.Key_DT,axis=0)) & (df.filter(like='Visit_').lt(pd.to_datetime('2018-03-25')).fillna(0).astype(bool)) & (df.filter(like='Deliv_').eq('Yes'))).sum(1)

标签: pythonpandasdatetimeconditional-statements

解决方案


您编写的代码不起作用,因为它不知道它应该Visit_#Deliv_#. 试试这个:

df.loc[((df.Key_DT < '2018-03-25') & (df.Key_DT >= '2018-01-20')), 'Vis_sum'] = ((df.filter(like='Visit_').gt(df.Key_DT,axis=0)) & (df.filter(like='Visit_').lt(pd.to_datetime('2018-03-25'),axis=0).fillna(0).astype(bool)) & (df.filter(like='Deliv_').rename(columns=lambda x: x.replace('Deliv','Visit')).eq('Yes'))).sum(1)

推荐阅读