首页 > 解决方案 > 使用 pandas.merge_asof 进行完全外连接

问题描述

嗨,我需要将一些时间序列数据与最近的时间戳对齐,所以我认为pandas.merge_asof这可能是一个不错的候选人。但是,它没有how='outer'像标准merge方法中那样设置的选项。

一个例子可以是:

df1:

                                   Value1
Time
2020-07-17 14:25:03.535906075      108
2020-07-17 14:25:05.457247019      110
2020-07-17 14:25:07.467777014      126

df2:

                                  Value2
Time
2020-07-17 14:25:03.535018921     222
2020-07-17 14:25:04.545104980     150
2020-07-17 14:25:07.476825953      60

然后例如,这样做merge_asof

pd.merge_asof(df1, df2, left_index=True, right_index=True, direction='nearest', tolerance=pd.Timedelta('0.3s'))

结果将是:

                               Value1  Value2
Time
2020-07-17 14:25:03.535906075     108   222.0
2020-07-17 14:25:05.457247019     110     NaN
2020-07-17 14:25:07.467777014     126    60.0

但我想要的是:

                               Value1  Value2
Time
2020-07-17 14:25:03.535906075     108   222.0
2020-07-17 14:25:04.545104980     NaN   150.0   <---- this is the difference
2020-07-17 14:25:05.457247019     110     NaN
2020-07-17 14:25:07.467777014     126    60.0

基本上就像一个完整的外部连接。

有什么建议吗?提前致谢。

编辑:

所以这是2个数据帧的情况。例如,如果有 10 个数据帧(即df1, df2, ..., df10)需要进行这种“最近的”合并,那该怎么做呢?

标签: pythonpandasdataframemergeouter-join

解决方案


  1. 不幸的是,没有像 with 一样的how参数,否则你可以简单地传递.pd.merge_asofpd.mergehow='outer'
  2. 作为一种解决方法,您可以append手动从其他数据框中获取不匹配的值
  3. 然后,对索引进行排序.sort_index()

df3 = pd.merge_asof(df1, df2, left_index=True, right_index=True, direction='nearest', tolerance=pd.Timedelta('0.3s'))
df4 = pd.merge_asof(df2, df1, left_index=True, right_index=True, direction='nearest', tolerance=pd.Timedelta('0.3s'))
df5 = df3.append(df4[df4['Value1'].isnull()]).sort_index()
df5
Out[1]: 
                               Value1  Value2
Time                                         
2020-07-17 14:25:03.535906075   108.0   222.0
2020-07-17 14:25:04.545104980     NaN   150.0
2020-07-17 14:25:05.457247019   110.0     NaN
2020-07-17 14:25:07.467777014   126.0    60.0

推荐阅读