You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

移除标准差上下异常值:18列1500万行数据集代码无效求助

解决Pandas过滤2倍标准差异常值后数据集未更新的问题

我一眼就看出了问题所在:你执行的过滤操作没有把结果赋值回原DataFrame,所以原始的df根本没被修改,最后保存的还是加载时的原始数据。

接下来我一步步帮你修正,还会针对你1500万行的大数据集给出优化方案:

1. 问题根源拆解

你写的这行代码:

df[df.apply(lambda x :(x-x.mean()).abs()<(2*x.std()) ).all(1)]

它确实生成了一个过滤掉异常值的新DataFrame,但你没有把这个新结果重新赋值给df,原变量df自然还是最初加载的原始数据,最后导出的当然也没变化。

2. 基础修正方案

只需把过滤结果重新赋值给df即可,这是最直接的解决方式:

import pandas as pd
import numpy as np

df = pd.read_csv('D:\\Project\\database\\3-Last\\LastCombineHalf.csv')

# 过滤掉任意一列超出2倍标准差范围的行,并覆盖原df
df = df[df.apply(lambda x: (x - x.mean()).abs() < (2 * x.std()), axis=0).all(axis=1)]

df.to_csv('D:\\Project\\database\\3-Last\\Removal.csv', index=False)

3. 针对1500万行大数据集的效率优化

你的数据集规模很大,用apply逐行处理效率会很低,推荐用向量化操作来大幅提速——利用Pandas/Numpy的批量计算能力,避免逐行遍历:

import pandas as pd
import numpy as np

df = pd.read_csv('D:\\Project\\database\\3-Last\\LastCombineHalf.csv')

# 一次性计算所有数值列的均值和2倍标准差范围
col_means = df.mean()
col_stds = df.std()
lower_bounds = col_means - 2 * col_stds
upper_bounds = col_means + 2 * col_stds

# 生成布尔掩码:只有当某一行的所有列都在范围内时,标记为True
valid_rows = ((df >= lower_bounds) & (df <= upper_bounds)).all(axis=1)

# 过滤有效行并更新原df
df = df[valid_rows]

df.to_csv('D:\\Project\\database\\3-Last\\Removal.csv', index=False)

这种方法的计算速度会快很多,还能减少内存占用,更适合处理千万级别的数据集。

额外小提醒

  • 如果你的数据里包含非数值列,记得先筛选出数值列再计算标准差范围,避免出现类型错误。
  • 如果遇到内存不足的问题,可以在读取CSV时用dtype参数指定更高效的数据类型(比如用float32代替float64),或者分块读取处理。

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

火山引擎 最新活动