我正在尝试合并两个列上的两个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')