💡 参考文章见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 pdimport numpy as npimport 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:剔除之后的数据,或者剔除异常值之后的行索引名称 ''' 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
使用
1 df = pd.read_csv('./test.csv' )
独立使用
针对整体DataFrame的某一列数值(列名是下面代码的colName
,对应替换即可),进行使用
1 2 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 )]) 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 pdimport numpy as npimport mathdef n_sigma (data,n ): ''' 进行3sigma剔除 :param data:传入的数据 :return:剔除之后的数据,或者剔除异常值之后的行索引名称 ''' 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) return 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 )]) df = df.reset_index(drop=True ) df.index.name = None
Ref