数据
df1具有项目名称,经理名称以及每个项目的开始和结束日期。开始日期可能缺少值,但是supp_date始终是近似值。
project manager start_date end_date supp_date
Apple A 2001-05-03 2002-08-09 2002-05-10
Apple B 2002-10-03 2003-11-12 2002-10-09
Orange D nan 2002-10-21 2002-06-25
Banana C nan 2003-01-02 2002-11-03
Banana D nan 2003-12-15 2003-02-12
Peach C 2003-07-21 2003-10-12 2003-07-23
df2仅具有日期和项目名称:
project begin_date
Apple 2002-01-02
Banana 2003-05-13
想法
对于df2中的每个项目,我想找出其经理。由于同一项目在不同时期有不同的经理,因此我可以使用日期。例如,df2中的Apple项目始于2002年1月2日。在df1中有两个名为Apple的项目,但是2002-01-02在2001-05-03和2002-08-09之间。因此,我们知道经理在df2中应该是Apple的A。
df2中的香蕉项目于2003-05-13开始。由于df1中没有香蕉项目的start_date,因此我们将supp_date用作start_date。所以2003-05-13介于2003-02-12和2003-12-15之间,我们知道经理是D。
结果
project begin_date manager
Apple 2002-01-02 A
Banana 2003-05-13 D
有什么快速方法可以做到以下几点? df2确实很大(〜100万行),所以我认为循环会非常慢...
1)对于df2中的每个项目,检查df1中的哪个项目具有相同的名称
2)基于1),如果start_date不丢失,请使用start_date。否则,请使用supp_date
3)如果begin_date在start_date和end_date之间,或者如果缺少start_date,则在supp_date和end_date之间找到管理员。
非常感谢您的帮助!
答案 0 :(得分:1)
我建议使用merge
和between
(假设df2不会有重复的项目具有不同的begin_date):
# merge on project
merge = df.merge(df2, on='project')
# fill missing start_date with supp_date
merge['start_date'] = merge['start_date'].fillna(merge['supp_date'])
# boolean indexing with between
merge[merge['begin_date'].between(merge['start_date'], merge['end_date'])]
project manager start_date end_date supp_date begin_date
0 Apple A 2001-05-03 2002-08-09 2002-05-10 2002-01-02
3 Banana D 2003-02-12 2003-12-15 2003-02-12 2003-05-13
然后您可以删除不需要的列。