
本教程详细介绍了如何在Pandas中高效地合并两个DataFrame,其中一个DataFrame的时间列需要落在另一个DataFrame的两个时间列所定义的区间内。针对传统循环合并的性能瓶颈,文章提出并演示了利用NumPy广播机制进行向量化比较,从而实现显著的性能提升。教程涵盖了数据准备、广播逻辑、结果重构及重要的内存和索引处理注意事项。
在数据分析和处理中,我们经常需要根据复杂的条件来合并(join)或连接(merge)不同的数据集。当合并条件涉及到时间范围匹配时,例如判断一个时间点是否落在一个时间区间内,传统的基于循环的迭代方法往往效率低下,尤其是在处理大型数据集时。本教程将深入探讨如何利用Pandas和NumPy的强大功能,以高性能的方式解决这类时间范围合并问题。
场景描述
假设我们有两个Pandas DataFrame:
- df1 包含时间区间信息,例如 time_1 和 time_2 列,以及其他数据 dummy_data。
- df2 包含一系列时间点,例如 time_3 列,以及其他数据 dummy_data2。
我们的目标是:将 df2 中的每一行与 df1 中的行进行匹配,条件是 df2 的 time_3 值必须严格介于 df1 的 time_1 和 time_2 之间(即 time_1
示例数据结构:
df1 示例:
| time_1 | time_2 | dummy_data |
|---|---|---|
| 2023-10-01 04:02:00 | 2023-10-01 08:29:00 | -245.67 |
| 2023-10-01 04:03:00 | 2023-10-01 08:49:00 | -1772.95 |
df2 示例:
| time_3 | dummy_data2 |
|---|---|
| 2023-10-01 06:21:13.238024 | -131.37 |
| 2023-10-01 06:47:19.796628 | -236.28 |
| 2023-10-01 08:33:53.081095 | -103.73 |
期望的输出结果:
| time_1 | time_2 | dummy_data | time_3 | dummy_data2 |
|---|---|---|---|---|
| 2023-10-01 04:02:00 | 2023-10-01 08:29:00 | -245.67 | 2023-10-01 06:21:13.238024 | -131.37 |
| 2023-10-01 04:02:00 | 2023-10-01 08:29:00 | -245.67 | 2023-10-01 06:47:19.796628 | -236.28 |
| 2023-10-01 04:03:00 | 2023-10-01 08:49:00 | -1772.95 | 2023-10-01 06:21:13.238024 | -131.37 |
| 2023-10-01 04:03:00 | 2023-10-01 08:49:00 | -1772.95 | 2023-10-01 06:47:19.796628 | -236.28 |
| 2023-10-01 04:03:00 | 2023-10-01 08:49:00 | -1772.95 | 2023-10-01 08:33:53.081095 | -103.73 |
传统(低效)的解决方案
一种直观但效率低下的方法是使用嵌套循环遍历 df1 的每一行,然后对 df2 的 time_3 列应用 between 方法,最后通过 append 或 concat 逐行构建结果DataFrame。
还木有评论哦,快来抢沙发吧~