python - 使用 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
)需要进行这种“最近的”合并,那该怎么做呢?
解决方案
- 不幸的是,没有像 with 一样的
how
参数,否则你可以简单地传递.pd.merge_asof
pd.merge
how='outer'
- 作为一种解决方法,您可以
append
手动从其他数据框中获取不匹配的值 - 然后,对索引进行排序
.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
推荐阅读
- css - 网页不会使用 Pug/W3.CSS 滚动
- java - 如何使用 Jaxb2Marshaller 从 xml 中获取嵌套元素
- flutter - 错误:无法将参数类型“FirebaseApp”分配给参数类型“Firebase”
- javascript - 如何通过检查对象的值来保持构造字符串的间距
- visual-studio-code - 如何在 VSC 中设置 Zephyr 项目应用程序?
- javascript - Node.js 函数没有使用 async/await 和 SQLite3 命令以正确的顺序运行?
- oauth - Snowflake Oauth 集成设置 - 更改端点变量
- ruby-on-rails - 错误:container_linux.go:367:启动容器进程导致:exec:“entrypoint.sh”:$PATH 中找不到可执行文件:未知
- python - 在列表中查找具有重复项的“n”个不同元素,== 可以,=== 不行
- c# - 如何使用 C# 使用记事本打开 .txt 文件