相关疑难解决方法(0)

检测并排除Pandas数据帧中的异常值

我有一个包含很少列的pandas数据帧.

现在我知道某些行是基于某个列值的异常值.

例如列 - 'Vol'的所有值都大约为12xx,一个值为4000(异常值).

现在我想排除那些有'Vol'列的行.因此,基本上我需要在数据框上放置一个过滤器,以便我们选择所有行,其中某列的值在与平均值相差3个标准差的范围内.

实现这一目标的优雅方式是什么?

python filtering outliers dataframe pandas

174
推荐指数
12
解决办法
19万
查看次数

熊猫 - 用groupby替换异常值

我有一个大熊猫数据框,我想分成小组,计算平均值和标准差,然后用组的平均值替换所有异常值.如果异常值远离组平均值超过3个标准偏差,则定义为异常值.

df = pandas.DataFrame({'a': ['A','A','A','B','B','B','B'], 'b': [1.1,1.2,1.1,3.3,3.4,3.3,100.0]})
Run Code Online (Sandbox Code Playgroud)

我认为以下内容可行:

df.groupby('a')['b'].transform(lambda x: x[i] if np.abs(x[i]-x.mean())<=(3*x.std()) else x.mean() for i in range(0,len(x)))
Run Code Online (Sandbox Code Playgroud)

但是得到以下错误:

NameError:未定义名称"x"

我也尝试分别定义转换函数:

def trans_func(x):
    mean = x.mean()
    std = x.std()
    length = len(x)
    for i in range(0,length):
        if abs(x[i]-mean)<=(3*std):
            return x
        else:
            return mean
Run Code Online (Sandbox Code Playgroud)

然后像这样调用它:

df.groupby('a')['b'].transform(lambda x: trans_func(x))
Run Code Online (Sandbox Code Playgroud)

但我得到一个不同的错误:

KeyError:0

最后,我完全创建了一个单独的专栏:

df['c'] = [df.groupby('a')['b'].transform(mean) if df.groupby('a')['b'].transform(lambda x: (x - x.mean()) / x.std()) > 3 else df['b']] 
Run Code Online (Sandbox Code Playgroud)

但这也没有奏效:

ValueError:Series的真值是不明确的.使用a.empty,a.bool(),a.item(),a.any()或a.all().

任何建议都非常感谢.

python pandas

3
推荐指数
2
解决办法
5679
查看次数

标签 统计

pandas ×2

python ×2

dataframe ×1

filtering ×1

outliers ×1