我有一个包含很少列的pandas数据帧.
现在我知道某些行是基于某个列值的异常值.
例如列 - 'Vol'的所有值都大约为12xx,一个值为4000(异常值).
现在我想排除那些有'Vol'列的行.因此,基本上我需要在数据框上放置一个过滤器,以便我们选择所有行,其中某列的值在与平均值相差3个标准差的范围内.
实现这一目标的优雅方式是什么?
我有一个大熊猫数据框,我想分成小组,计算平均值和标准差,然后用组的平均值替换所有异常值.如果异常值远离组平均值超过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().
任何建议都非常感谢.