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

如何加速Pandas的transform函数?优化离群值处理代码

加速Pandas分组异常值处理的矢量化方案

你的原始代码通过transform调用自定义函数逐组处理,在数据量大或分组较多时会因Python层面的循环开销变慢。下面是完全矢量化的优化方案,能大幅提升运行效率:

优化思路

直接用Pandas的分组聚合与矢量化操作替代自定义函数,避免逐组调用Python函数的额外开销:

  • 按CustomerName分组,计算每组的均值和标准差,并生成对应到每条数据的统计列
  • 基于分组统计值计算上限阈值
  • 用矢量化条件判断直接替换超出范围的值为NaN

优化代码

import numpy as np
import pandas as pd

# 生成每条数据对应的组内均值、标准差列
df['group_mean'] = df.groupby("CustomerName")["Difference"].transform('mean')
df['group_std'] = df.groupby("CustomerName")["Difference"].transform('std')

# 计算上限阈值
df['upper_limit'] = df['group_mean'] + df['group_std'] * 1

# 矢量化替换异常值
df.loc[(df['Difference'] > df['upper_limit']) | (df['Difference'] < 0), 'Difference'] = np.nan

# 清理临时统计列
df = df.drop(['group_mean', 'group_std', 'upper_limit'], axis=1)

更简洁的链式写法

df = (df
      .assign(
          group_mean=lambda x: x.groupby("CustomerName")["Difference"].transform('mean'),
          group_std=lambda x: x.groupby("CustomerName")["Difference"].transform('std'),
          upper_limit=lambda x: x['group_mean'] + x['group_std']
      )
      .assign(
          Difference=lambda x: np.where(
              x['Difference'].between(0, x['upper_limit']),
              x['Difference'],
              np.nan
          )
      )
      .drop(['group_mean', 'group_std', 'upper_limit'], axis=1))

性能提升原因

  • 原始代码的transform(is_outlier)会对每个分组单独执行Python函数,涉及大量分组对象的创建与拼接,带来显著的Python层开销
  • 优化方案全程使用Pandas内置的矢量化操作,底层由C扩展实现,避免了逐组循环,数据量越大,性能提升越明显(通常能达到数倍至数十倍的加速)

结果一致性

优化后的逻辑和原始代码完全一致:仅保留[0, 均值+1倍标准差]范围内的值,超出范围的替换为NaN。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:50:27