【问题标题】:Merging dataframes based on date range and identifiers根据日期范围和标识符合并数据框
【发布时间】:2021-04-01 09:03:57
【问题描述】:

我想根据所售商品在日期范围内、价格匹配和商品 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_asof、numpy.piecewise 和pandasql,但这似乎有点超出我目前的技能上限。非常感谢任何帮助。

【问题讨论】:

标签: python pandas dataframe numpy merge


【解决方案1】:

我们可以做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

【讨论】:

  • 精氨酸!!!你又改了名字和形象!节日快乐!希望您和您的家人平安健康。
  • @ScottBoston 节日快乐,注意安全~
  • 太棒了。谢谢你们俩!
【解决方案2】:

如果您的数据框太大,您可以使用笛卡尔连接,使用merge 和how='left',然后使用query 过滤数据框的开始日期和结束日期之间的日期。

df_sales['Promo'] = df_sales.merge(df_promo, on='ID', how='left')\
                            .query('Start_Date <= Date <= End_Date')['Promo']
df_sales['Promo'] = df_sales['Promo'].fillna('Non-event')
print(df_sales)

输出:

        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     Event1
3 2020-01-10   4   5.99  Non-event
4 2020-01-11   3  10.99  Non-event

【讨论】:

    猜你喜欢
    • 2015-09-28
    • 2018-11-14
    • 2021-05-25
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    相关资源
    最近更新 更多