如何在连接两个数据集时获取最新行,并且最新行应小于数据集“A”中的日期[重复]

问题描述 投票:0回答:1

假设我有一个数据集,其中有一个每天生成的日期列,如下所示。

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 获取所有匹配记录时

python pandas database dataframe numpy
1个回答
0
投票

用途:

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
© www.soinside.com 2019 - 2024. All rights reserved.