根据多个其他列中特定范围内日期的存在创建一个列
Create a column based on presence of dates within a specific range in multiple other columns
我有一个名为 df 的数据框,看起来与此类似(除了 'Visit' 列的数量增加到 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
。如果从 Visit_1
到 Visit_5
的任何一列中至少有四个日期落在 2018-10-15
和之间,我想将 Four_Visits
设置为等于 1
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
如果尚未转换为 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
我有一个名为 df 的数据框,看起来与此类似(除了 'Visit' 列的数量增加到 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
。如果从 Visit_1
到 Visit_5
的任何一列中至少有四个日期落在 2018-10-15
和之间,我想将 Four_Visits
设置为等于 1
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
如果尚未转换为 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