You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Pandas中基于另一DataFrame范围高效分组连续数据的方法

高效匹配连续数据与试验时间区间的Pandas最优方案

针对你处理大规模数据集的需求,完全向量化的NumPy/Pandas操作是最优解——它能避开所有逐行循环(包括iterrows/itertuples/apply这类本质还是逐行的方法),直接利用底层C级运算,速度能提升几个数量级。

核心思路

我们把连续数据的时间点和试验的时间区间都转为NumPy数组,通过广播机制一次性判断所有时间点属于哪个试验区间,再映射对应的trial和type值。

实现代码

import numpy as np
import pandas as pd
import time

def vectorized_method(trials_df, continuous_df):
    # 提取核心数组:连续数据的时间点、试验的开始/结束时间、trial和type值
    times = continuous_df.index.values
    starts = trials_df['start'].values
    ends = trials_df['end'].values
    trial_vals = trials_df['trial'].values
    type_vals = trials_df['type'].values
    
    # 广播判断每个时间点是否落在某个试验区间内(二维布尔数组:时间点×试验)
    in_interval = (times[:, np.newaxis] >= starts) & (times[:, np.newaxis] <= ends)
    
    # 找到每个时间点对应的试验索引(-1表示不在任何区间)
    trial_idx = np.where(in_interval.any(axis=1), in_interval.argmax(axis=1), -1)
    
    # 映射trial和type值,-1的位置设为NaN
    continuous_df['trial'] = np.where(trial_idx == -1, np.nan, trial_vals[trial_idx])
    continuous_df['type'] = np.where(trial_idx == -1, np.nan, type_vals[trial_idx])
    return continuous_df

性能测试对比

把这个方法加入你的测试代码,运行后会发现它的耗时远低于其他方法:

if __name__ == '__main__':
    num_trials = 360
    max_start_time = 1400
    trials_df = create_trials_df(max_start=max_start_time)
    data_df = create_continuous_df(max_start=max_start_time)
    
    # 测试新方法
    def vectorized_test(trials_df, continuous_df):
        return vectorized_method(trials_df, continuous_df.copy())
    
    vectorized_df = performance_test(vectorized_test, trials_df, data_df)
    
    # 其他原有测试...
    iterrows_df = performance_test(iterrows_test,trials_df, data_df)
    itertuples_df = performance_test(itertuples_test,trials_df, data_df)
    apply_df = performance_test(apply_test,trials_df, data_df)
    map_idx_df = performance_test(real_slow_index_map,trials_df, data_df)
    jp_df = performance_test(jp_data_analysis_answer,trials_df, data_df)

为什么这个方法快?

  • 向量化运算:所有判断都在NumPy的C底层完成,没有Python级别的逐行循环开销
  • 广播机制:一次性处理所有时间点和区间的匹配,避免了重复的索引查找操作
  • 无内存浪费:用布尔数组和索引映射替代了多次loc切片赋值(loc在循环里会反复触发索引更新,非常耗时)

额外说明

如果你的试验区间是不重叠的(从你的示例数据看是这样),这个方法完全适用;如果有重叠区间,argmax会返回第一个匹配的试验,你可以根据需求调整逻辑(比如返回所有匹配的试验)。

内容的提问来源于stack exchange,提问作者Olaf H.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:56:31