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



我正在尝试合并两个列上的两个pandas dataframes。一列具有独特的标识符,可以简单地用来.merge()两个数据范围。但是,第二列合并实际上将使用.merge_asof(),因为它需要找到最近的日期,而不是确切的日期匹配。

这里有一个类似的问题:Pandas在名字和最接近日期中合并,但是大约三年前被问到并回答了,merge_asof()是一个更新的补充。

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

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

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

ID s将完全匹配,但date_time的s将是"接近匹配"。

任何帮助都非常感谢。

考虑在ID上首先合并,然后运行一个DataFrame.apply,以返回最高 date_time 从匹配的IDS上的第一个dataframe 小于当前行 date_time 从第二个dataframe。

# 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)

这假定您要保留所有DF2的行(即右JOIN )。只需flip _x/_y for 左JOIN

当前解决方案将在一个小数据集上工作,但是如果您有数百行...恐怕不是。

所以,您想做的是如下:

df = pd.merge_asof(df1, df2, on = 'date_time', by = 'ID', direction = 'nearest')

最新更新