我有两个Pandas DataFrame,想将它们合并到两个属性key
和date
上,其中date
是日期时间,如果第二个日期是第二行,则应该合并两行表距第一个表中的日期有+ -7天的时间。
当前,我先合并数据帧,然后再选择匹配的行,但这很慢,并且会导致庞大的中间表:
res = pd.merge(left, right, on=['key'], how='inner')
mask = (
((res['date_x'] + pd.Timedelta(0, 'days')) <= (res['date_y'] + pd.Timedelta(7, 'days'))) &
((res['date_x'] - pd.Timedelta(0, 'days')) >= (res['date_y'] - pd.Timedelta(7, 'days')))
)
res = res.loc[mask]
是否有更快的方法来达到相同的结果,例如条件合并?
答案 0 :(得分:2)
没有看到可重复的示例,听起来您可能正在寻找merge_asof
函数(如果我正确理解了您的问题)。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge_asof.html应该类似于:
pd.merge_asof(left, right, on="date", by="key", tolerance=pd.Timedelta(7, 'days'))