如何高效优化pandas DataFrame抽样代码,去除循环提升速度?
优化方案:移除循环,利用向量化操作提升效率
原代码的循环逻辑可以完全用pandas的向量化操作替代,核心原因是:你对抽样子集df[i::sampling_period]计算的相邻元素差分,本质上等价于对整个DataFrame计算间隔为sampling_period的差分(即df.diff(periods=sampling_period))。抽样子集里的每一对相邻元素,正好对应原数据中位置相差sampling_period的两个元素,所以不需要拆分子集逐一处理。
优化后的代码
import pandas as pd data = { 'col1': [17,2,3,4,5,5,10,22,31,11,65,86], 'col2': [6,7,8,9,10,31,46,12,20,37,91,32], 'col3': [1,2,3,4,5,6,7,8,9,10,11,12] } df = pd.DataFrame(data) sampling_period = 3 # 计算整个DataFrame间隔sampling_period的差分 diff_df = df.diff(periods=sampling_period) # 检查每一列是否存在至少一个差分≥5的情况 abnormal_data = set(diff_df.columns[diff_df.ge(5).any(axis=0)]) print(f"abnormal_data: {abnormal_data}")
逻辑说明
df.diff(periods=sampling_period):直接计算每一行与前sampling_period行的差值,这一步一次性完成原循环中所有抽样子集的差分计算,完全向量化,效率极高。diff_df.ge(5):生成布尔矩阵,标记所有差值≥5的位置。.any(axis=0):对每一列检查是否存在至少一个True(即该列有满足条件的差分)。- 最后通过列索引筛选出所有异常列,转为集合即可。
效率提升对比
对于你提到的(20040, 3562)规模的DataFrame,原循环需要约683秒,优化后的代码仅需毫秒级即可完成计算——因为向量化操作避免了循环中的重复数据切片和逐次处理,充分利用了pandas的底层优化。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

