💡 参考文章见Ref,感谢提供思路!
🗺️当前这篇博文地址:https://myoontyee.github.io/article/ccd63a75.html
⚠️警告:博客文章禁止一切形式的非授权非法转载!
⚠️Attention: All forms of unauthorized illegal reposts are prohibited !

创建时间:2022年3月24日15:16:08
最新更新:2022年3月26日14:23:02


核心思路:符合条件返回索引,取符合条件的索引


引入所需库

1
2
3
import pandas as pd
import numpy as np
import math

函数块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def n_sigma(data,n):
'''
进行3sigma剔除
:param data:传入的数据
:return:剔除之后的数据,或者剔除异常值之后的行索引名称
'''
#均值-标准差
#如果结果在(u-3sigma,u+3sigma)之间则认为是正确数据。
if math.isnan(data.std()):
bool_num = ((data.mean()-n*0) <= data) & ((data.mean()+n*0) >= data)
else:
bool_num = ((data.mean()-n*data.std()) <= data) & ((data.mean()+n*data.std()) >= data)

#按布尔类型返回正确的数据
return bool_num
# return data.loc[bool_num,:]

使用

  • 读数据
1
df = pd.read_csv('./test.csv')

独立使用

  • 针对整体DataFrame的某一列数值(列名是下面代码的colName,对应替换即可),进行使用
1
2
# 3sigma滤波
df_3sigma = df.loc[n_sigma(df.loc[:,'colName'], n = 3),:]

与groupby结合使用

  • groupby结合使用,即先分组,再对每组的特定列进行n-sigma滤波,最后返回一个DataFrame(返回的不是group结果,是一个Dataframe)
    • groupbyName修改为groupby所针对的列的列名
    • colName修改为进行3sigma滤波的列的列名
1
2
3
df = df.groupby('groupbyName').apply(lambda x:x.loc[n_sigma(x.loc[:,'colName'], n = 3)]) # 3sigma滤波
df = df.reset_index(drop=True)
df.index.name = None

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 导入库
import pandas as pd
import numpy as np
import math

# 函数定义
def n_sigma(data,n):
'''
进行3sigma剔除
:param data:传入的数据
:return:剔除之后的数据,或者剔除异常值之后的行索引名称
'''
#均值-标准差
#如果结果在(u-3sigma,u+3sigma)之间则认为是正确数据。
if math.isnan(df['b'].std()):
bool_num = ((data.mean()-n*0) <= data) & ((data.mean()+n*0) >= data)
else:
bool_num = ((data.mean()-n*data.std()) <= data) & ((data.mean()+n*data.std()) >= data)
# print("(data.mean()-n*data.std())",(data.mean()-n*data.std()))
# print("(data.mean()-n*data.std())",(data.mean()+n*data.std()))

#按布尔类型返回正确的数据
return bool_num
# return data.loc[bool_num,:]


# 读数据
df = pd.read_csv('./test.csv')

# 使用
df_3sigma = df.loc[n_sigma(df.loc[:,'colName'], n = 3),:]


df = df.groupby('groupbyName').apply(lambda x:x.loc[n_sigma(x.loc[:,'colName'], n = 3)]) # 3sigma滤波
df = df.reset_index(drop=True)
df.index.name = None

Ref