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

elP*_*tor 5 python merge pandas

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

这里有一个类似的问题:熊猫在名称和最近日期上合并,但它是在三年前提出并回答的,它merge_asof()是一个较新的添加。

几个月前,我在这里提出了类似的问题,但是该解决方案只需要使用merge_asof()而无需任何精确匹配。

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

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

的位置ID将完全匹配,而date_time的位置将是“接近匹配”。

任何帮助是极大的赞赏。

Par*_*ait 4

考虑首先进行合并ID,然后运行 ​​aDataFrame.apply以从第一个数据帧返回小于第二个数据帧中当前行日期时间的匹配 ID 的最高日期时间

# INITIAL MERGE (CROSS-PRODUCT OF ALL ID PAIRINGS)
mdf = pd.merge(df1, df2, on=['ID'])

def f(row):
    col = mdf[(mdf['ID'] == row['ID']) & 
              (mdf['date_time_x'] < row['date_time_y'])]['date_time_x'].max()
    return col

# FILTER BY MATCHED DATES TO CONDITIONAL MAX
mdf = mdf[mdf['date_time_x'] ==  mdf.apply(f, axis=1)].reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

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