从pandas dataframe python中删除异常值

时间:2017-08-02 13:00:44

标签: python pandas outliers

我有一个使用pandas

创建数据框的代码
import pandas as pd
import numpy as np

x = (g[0].time[:111673])
y = (g[0].data.f[:111673])
df = pd.DataFrame({'Time': x, 'Data': y})
#df

打印出来:

          Data          Time
0        -0.704239      7.304021
1        -0.704239      7.352021
2        -0.704239      7.400021
3        -0.704239      7.448021
4        -0.825279      7.496021

哪个好,但我知道这些数据中有异常值我想删除,所以我在下面创建了这个数据框以指出它们:

newdf = df.copy()
Data = newdf.groupby('Data')
newdf[np.abs(newdf.Data-newdf.Data.mean())<=(3*newdf.Data.std())]
newdf['Outlier'] = Data.transform( lambda x: abs(x-x.mean()) > 1.96*x.std() )
#newdf

打印出来:

             Data          Time  Outlier
0        -0.704239      7.304021    False
1        -0.704239      7.352021    False
2        -0.704239      7.400021    False
3        -0.704239      7.448021    False
4        -0.825279      7.496021    False

在我的数据示例中,您无法看到它,但可能有300个异常值,我想删除它们而不会弄乱原始数据帧,然后将它们一起绘制为压缩。 我的问题是:所以我不是打印出错误/真实,而是如何消除真实的异常值?所以我最终可以将它们绘制在同一个图表中进行比较。

我已经尝试过的代码:

newdf[np.abs(newdf.Data-newdf.Data.mean())<=(1.96*newdf.Data.std())]

newdf = df.copy()
def replace_outliers_with_nan(df, stdvs):
    newdf=pd.DataFrame()
    for i, col in enumerate(df.sites.unique()):
        df = pd.DataFrame(df[df.sites==col])
        idx = [np.abs(df-df.mean())<=(stdvs*df.std())] 
        df[idx==False]=np.nan  
        newdf[col] = df
    return newdf

这两个都不起作用,它们返回与原始数据帧相同数量的数据点但是我知道如果它删除了异常值,则点的数量将小于原始数据点。

1 个答案:

答案 0 :(得分:1)

对于反转条件,您似乎需要boolean indexing~,因为需要过滤器而不是异常值行(以及删除异常值):

df1 = df[~df.groupby('Data').transform( lambda x: abs(x-x.mean()) > 1.96*x.std()).values]
print (df1)
       Data      Time
0 -0.704239  7.304021
1 -0.704239  7.352021
2 -0.704239  7.400021
3 -0.704239  7.448021
4 -0.825279  7.496021