Pandas基于时间范围合并DataFrame的高效策略

admin 百科 8

Pandas基于时间范围合并DataFrame的高效策略-第1张图片-佛山资讯网

在数据分析和处理中,我们经常会遇到需要根据非精确匹配条件合并(或连接)两个DataFrame的场景。其中一个常见的需求是,将一个DataFrame中的记录与另一个DataFrame中某个时间戳落在特定时间范围内的记录进行关联。传统的迭代方法虽然直观,但在处理大量数据时往往效率低下。本文将介绍一种利用NumPy广播机制实现此类时间范围条件合并的高效策略。

理解问题与传统方法的局限性

假设我们有两个DataFrame:

  • df1 包含 time_1 和 time_2 两列,定义了一个时间区间。
  • df2 包含 time_3 列,表示一个具体的时间点。

我们的目标是,对于 df1 中的每一行,找到 df2 中所有 time_3 值介于 df1 当前行的 time_1 和 time_2 之间的行,并将它们合并起来。这意味着 df1 中的一行可能会与 df2 中的多行匹配,从而在结果DataFrame中重复出现。

以下是使用传统Python循环实现此逻辑的示例:

import pandas as pd
import numpy as np

# 模拟数据
data1 = {
    'time_1': pd.to_datetime(['2023-10-01 04:02:00', '2023-10-01 04:03:00']),
    'time_2': pd.to_datetime(['2023-10-01 08:29:00', '2023-10-01 08:49:00']),
    'dummy_data': [-245.67, -1772.95]
}
df1 = pd.DataFrame(data1)

data2 = {
    'time_3': pd.to_datetime([
        '2023-10-01 06:21:13.238024',
        '2023-10-01 06:47:19.796628',
        '2023-10-01 07:37:06.438740',
        '2023-10-01 08:16:16.995256',
        '2023-10-01 08:33:53.081095'
    ]),
    'dummy_data2': [-131.37, -236.28, 5.92, -134.03, -103.73]
}
df2 = pd.DataFrame(data2)

# 传统循环方法(效率低下)
# indexes = {}
# for i in df1.index:
#     s = df2['time_3'].between(df1.loc[i]['time_1'],
#                               df1.loc[i]['time_2'],
#                               inclusive='left')
#     friends = list(s[s == True].index)
#     indexes[i] = friends

# output_df_slow = pd.DataFrame()
# for key in indexes.keys():
#     for idx in indexes[key]:
#         output_df_slow = pd.concat([df1.loc[[key]],
#                                     df2.loc[[idx]]],
#                                    axis=1, ignore_index=True) # 修改为loc[[key]]和loc[[idx]]以保留DataFrame结构
# print(output_df_slow)

登录后复制

上述循环方法在DataFrame规模较小时尚可接受,但当 df1 和 df2 拥有大量行时,嵌套循环和反复的 loc 操作会导致显著的性能问题,因为它们本质上是逐行处理,无法充分利用Pandas和NumPy底层优化的向量化操作。

高效解决方案:利用NumPy广播机制

NumPy的广播(Broadcasting)机制允许我们对不同形状的数组执行算术运算,其核心思想是自动扩展较小数组以匹配较大数组的形状。在条件合并的场景中,我们可以利用广播一次性比较 df1 中的所有时间范围与 df2 中的所有时间点,从而避免显式循环。

核心步骤与示例代码

  1. 重置索引(可选但推荐):为了确保在后续 iloc 操作中索引的连续性和准确性,建议在操作前重置两个DataFrame的索引。如果原始索引有特殊含义且不希望丢失,可以在重置前保存。

    标签: python c语言 大数据

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~