假设我有一个数据集,其中有一个每天生成的日期列,如下所示。
DF_A
ID name qty date
1 abc 20 17/01/2022
1 abc 10 18/01/2022
2 def 10 24/01/2022
2 def 40 25/01/2022
2 def 67 26/01/2022
DF_B
ID name price_dt price
1 abc 18/01/2022 23.56
1 abc 17/01/2022 10.56
1 abc 16/01/2022 44.33
1 abc 15/01/2022 56.11
2 def 25/01/2022 2.98
2 def 26/01/2022 4.92
2 def 27/01/2022 4.88
2 def 24/01/2022 3.33
2 def 23/01/2022 8.47
2 def 22/01/2022 3.89
我将 DF_A 与 DF_B 结合在一起,我只需要小于日期列的最近的 Price_dt 记录。这可以通过加入 2 个 DF 并通过对 Price_dt DESC 进行排序来删除重复项来完成,但挑战是 DF 大小如此之大,并且加入不可行。所以我希望在加入之前减少 DF_B 中的行。
我尝试过的代码
DF_C = pd.merge(DF_A,DF_B,on='ID',how='left')
# (This actually give 40 rows which is not optimum way of doing for larger dataset)
Expected_DF = DF_C.sort_values(by=['price_dt'], ascending=False)
Expected_DF = Expected_DF.drop_duplicates(subset=['ID','name','date'],keep='first')
预期_DF:
ID name qty date price_dt price
1 abc 20 17/01/2022 16/01/2022 44.33
1 abc 10 18/01/2022 17/01/2022 10.56
2 def 10 24/01/2022 23/01/2022 8.47
2 def 40 25/01/2022 24/01/2022 3.33
2 def 67 26/01/2022 25/01/2022 2.98
我正在寻找可行的方法,当我可以减少内存使用而不是从 DF_B 获取所有匹配记录时
用途:
DF_A['date'] = pd.to_datetime(DF_A['date'], dayfirst=True)
DF_B['price_dt'] = pd.to_datetime(DF_B['price_dt'], dayfirst=True)
out = pd.merge_asof(DF_A.sort_values('date'),
DF_B.sort_values('price_dt'),
left_on='date',
right_on='price_dt',
by=['ID','name'],
allow_exact_matches=False)
print (out)
ID name qty date price_dt price
0 1 abc 20 2022-01-17 2022-01-16 44.33
1 1 abc 10 2022-01-18 2022-01-17 10.56
2 2 def 10 2022-01-24 2022-01-23 8.47
3 2 def 40 2022-01-25 2022-01-24 3.33
4 2 def 67 2022-01-26 2022-01-25 2.98