加入约会日期

时间:2018-04-04 18:21:07

标签: python pandas join

我有两个数据框,如:

df1 = pd.DataFrame({'Id' : [A, B, A, A, C],
 'date' : [01-01-15, 31-01-15, 03-02-15, 03-02-15, 15-03-16],
 'attr':[1, 5, 3, 5, 6]
  }, columns=['Id','date', 'attr'])

df2 = pd.DataFrame({'Id' : [A, B, A, A, B],
 'date' : [01-02-15, 01-01-15, 02-02-15, 03-12-15, 15-03-16],
 'counter':[1, 1, 2, 3, 2]
  }, columns=['Id','date', 'counter'])

第一个包含Id,日期和一些属性。 第二个包含Id,日期和其他属性(计数器随着时间的推移而增加)。 请注意,所有属性都会多次出现。

现在,我想"加入"这两个基于Id,但只考虑过去最接近df2的日期。

实际上,我的预期输出是:

Id | date     | att | counter
A  | 01-01-15 | 1   | Nan
B  | 31-01-15 | 5   | 1 
A  | 03-02-15 | 3   | 2
A  | 03-02-15 | 5   | 2
C  | 15-03-16 | 6   | NaN

请注意,NaN可以替换为任何其他合理的值,包括0。

第一个df包含大约300K行,而第二个df包含大约300万行。

1 个答案:

答案 0 :(得分:2)

您需要pd.merge_asof

pd.merge_asof(df1, df2.sort_values('date'), on='date', by='Id')

  Id       date  attr  counter
0  A 2015-01-01     1      NaN
1  B 2015-01-31     5      1.0
2  A 2015-03-02     3      2.0
3  A 2015-03-02     5      2.0
4  C 2016-03-15     6      NaN

direction参数的默认值为'backward' 来自Docs

  

两个DataFrame必须按键排序。

     

对于左侧DataFrame中的每一行:

     
      
  • “向后”搜索选择右侧DataFrame中的最后一行,其中“on”键小于或等于左侧的键。
  •   
  • “转发”搜索选择右侧DataFrame中的第一行,其中“on”键大于或等于左侧的键。
  •   
  • “最近”搜索选择右侧DataFrame中的行,其中“on”键与左侧键的绝对距离最近。
  •