首页 > 解决方案 > 根据日期范围和标识符合并数据框

问题描述

我想根据所售商品的条件合并两个数据框,该商品位于日期范围内,与价格匹配,并与商品 ID 匹配。非匹配项也需要保留,并标记为非事件。

销售数据:

Date        ID      Price
1/1/2020    3       9.99
1/1/2020    4       5.99
1/2/2020    10      69.99
1/10/2020   4       5.99
1/11/2020   3       10.99  

促销数据:

Start_Date   End_Date   ID   Price  Promo
1/1/2020     1/8/2020   3    9.99   Event1
1/1/2020     1/8/2020   4    5.99   Event1
1/1/2020     1/8/2020   10   49.99  Event1

期望的结果:

Date        ID     Price   Promo
1/1/2020    3      9.99    Event1
1/1/2020    4      5.99    Event1
1/2/2020    10     69.99   Non-Event
1/10/2020   4      5.99    Non-Event
1/11/2020   3      10.99   Non-Event

我已经坚持了很长一段时间。我尝试了几种不同的方法,包括merge_asofnumpy.piecewisepandasql,但这似乎有点超出我目前的技能上限。任何帮助是极大的赞赏。

标签: pythonpandasdataframenumpymerge

解决方案


我们可以做merge, 过滤它

out = Sales.merge(Promotional, on = ['ID','Price'],how='left')
#out.Date = pd.to_datetime(out.Date)
#out.Start_Date = pd.to_datetime(out.Start_Date)
#out.End_Date = pd.to_datetime(out.End_Date)
out.loc[~(out.Date.ge(out.Start_Date)&out.Date.le(out.End_Date))|out.Promo.isnull(),'Promo'] = 'no-Event'
out = out.drop(['Start_Date','End_Date'],axis=1)
out
Out[144]: 
        Date  ID  Price     Promo
0 2020-01-01   3   9.99    Event1
1 2020-01-01   4   5.99    Event1
2 2020-01-02  10  69.99  no-Event
3 2020-01-10   4   5.99  no-Event
4 2020-01-11   3  10.99  no-Event

推荐阅读