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.
相关产品推荐
相关产品推荐

