熊猫:合并确切的ID和最近的日期

时间:2017-02-17 02:11:27

标签: python pandas merge

我试图在两列上合并两个Pandas数据帧。一列具有唯一标识符,可用于简单地.merge()两个数据帧。但是,第二列合并实际上会使用.merge_asof(),因为它需要找到最接近的日期,而不是确切的日期匹配。

这里有一个类似的问题:Pandas Merge on Name and Closest Date,但大约三年前就被问到并回答了问题,merge_asof()是一个更新的补充。

几个月前我问了一个类似的here问题,但解决方案只需要使用merge_asof()而不需要任何完全匹配。

为了包含一些代码,它看起来像这样:

df = pd.merge_asof(df1, df2, left_on=['ID','date_time'], right_on=['ID','date_time'])

ID&#39}将完全匹配,但date_time" s匹配"

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

首先考虑合并i=4 initial best_seq={:length=>1, :next=>nil} j=5, arr[4]=37, arr[5]=57 h={:length=>1, :next=>nil} j=5 provides new best_seq={:length=>2, :next=>5} j=6, arr[4]=37, arr[6]=28 j=7, arr[4]=37, arr[7]=44 h={:length=>1, :next=>nil} i=3 initial best_seq={:length=>1, :next=>nil} j=4, arr[3]=46, arr[4]=37 j=5, arr[3]=46, arr[5]=57 h={:length=>1, :next=>nil} j=5 provides new best_seq={:length=>2, :next=>5} j=6, arr[3]=46, arr[6]=28 j=7, arr[3]=46, arr[7]=44 i=2 initial best_seq={:length=>1, :next=>nil} j=3, arr[2]=56, arr[3]=46 j=4, arr[2]=56, arr[4]=37 j=5, arr[2]=56, arr[5]=57 h={:length=>1, :next=>nil} j=5 provides new best_seq={:length=>2, :next=>5} j=6, arr[2]=56, arr[6]=28 j=7, arr[2]=56, arr[7]=44 ,然后运行DataFrame.apply以从匹配ID小于当前行 date_time <的第一个数据帧返回最高 date_time em>来自第二个数据帧。

i=1
  initial best_seq={:length=>1, :next=>nil}
    j=2, arr[1]=29, arr[2]=56
    h={:length=>2, :next=>5}
    j=2 provides new best_seq={:length=>3, :next=>2}
    j=3, arr[1]=29, arr[3]=46
    h={:length=>2, :next=>5}
    j=4, arr[1]=29, arr[4]=37
    h={:length=>2, :next=>5}
    j=5, arr[1]=29, arr[5]=57
    h={:length=>1, :next=>nil}
    j=6, arr[1]=29, arr[6]=28
    j=7, arr[1]=29, arr[7]=44
    h={:length=>1, :next=>nil}
i=0
  initial best_seq={:length=>1, :next=>nil}
    j=1, arr[0]=60, arr[1]=29
    j=2, arr[0]=60, arr[2]=56
    j=3, arr[0]=60, arr[3]=46
    j=4, arr[0]=60, arr[4]=37
    j=5, arr[0]=60, arr[5]=57
    j=6, arr[0]=60, arr[6]=28
    j=7, arr[0]=60, arr[7]=44
i=0: {:length=>1, :next=>nil}
i=1: {:length=>3, :next=>2}
i=2: {:length=>2, :next=>5}
i=3: {:length=>2, :next=>5}
i=4: {:length=>2, :next=>5}
i=5: {:length=>1, :next=>nil}
i=6: {:length=>2, :next=>7}
i=7: {:length=>1, :next=>nil}
  #=> [1, 2, 5] 

这假设您要保留df2的所有行(即右连接)。只需为左连接翻转_x / _y后缀。