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

如何高效优化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}")

逻辑说明

  1. df.diff(periods=sampling_period):直接计算每一行与前sampling_period行的差值,这一步一次性完成原循环中所有抽样子集的差分计算,完全向量化,效率极高。
  2. diff_df.ge(5):生成布尔矩阵,标记所有差值≥5的位置。
  3. .any(axis=0):对每一列检查是否存在至少一个True(即该列有满足条件的差分)。
  4. 最后通过列索引筛选出所有异常列,转为集合即可。

效率提升对比

对于你提到的(20040, 3562)规模的DataFrame,原循环需要约683秒,优化后的代码仅需毫秒级即可完成计算——因为向量化操作避免了循环中的重复数据切片和逐次处理,充分利用了pandas的底层优化。

内容的提问来源于stack exchange,提问作者Brian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 04:30:57