python - 根据日期范围和标识符合并数据框
问题描述
我想根据所售商品的条件合并两个数据框,该商品位于日期范围内,与价格匹配,并与商品 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
,但这似乎有点超出我目前的技能上限。任何帮助是极大的赞赏。
解决方案
我们可以做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
推荐阅读
- c - 如何在 Windows 的 gcc mingw 编译器中为 c 程序安装 libxml2?
- php - 如何在codeigniter控制器的回调函数中调用javascript函数?
- android - 关于 Google Play Console 每日 APK 和捆绑包限制
- java - 我在制作可查找用户 lat/lng 和设备 IMEI 的应用时遇到问题
- php - 某些页面在 polylang 插件 wordpress 中不起作用
- php - 如何在laravel中加入两个不同的数组并按日期显示顺序
- c - (条件?)在函数中创建局部变量
- java - 如何使用 JxBrowser 模拟键盘输入
- react-native - 用于传递参数的 Redux 调度或反应导航?
- javascript - 未捕获的类型错误:无法读取 backend.js 中未定义的属性“绑定”