从数据帧python中删除异常值

从数据帧python中删除异常值,python,pandas,outliers,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

我有一个使用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
             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
这很好,但我知道这些数据中存在我想要删除的异常值,所以我在下面创建了这个数据框来指出它们:

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
在我的数据示例中,您看不到它,但可能有300个异常值,我希望在不影响原始数据帧的情况下删除它们,然后将它们作为压缩绘制在一起。 我的问题是:那么,与其打印false/true,我如何才能消除真实的异常值呢?所以我最终可以把它们画在同一张图上进行比较

我已经尝试过的代码:

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
newdf[np.abs(newdf.Data newdf.Data.mean())对于反转条件,您似乎需要使用
~
,因为只需要过滤异常值行(并删除异常值):


当我尝试您的答案时,我得到了一个值错误:
raisevalueerror(msg.format(dtype=dt))ValueError:Boolean数组应用于条件,而不是float64
What-return
print(df.groupby('Data').transform(lambda x:abs(x-x.mean())>1.96*x.std())
?不是
真与假
序列?我发现问题,您需要
将序列转换为numpy数组。您的措辞让我有点困惑。是的,
打印(df.groupby('Data').transform(lambda x:abs(x-x.mean())>1.96*x.std())
为我的“时间”列返回一个
True或False
序列,而为“数据”列返回任何序列。但是我已经用
Data=newdf.groupby('Data')newdf[np.abs(newdf.Data newdf.Data.mean())1.96*x.std()得到了它)
我希望从“数据”列中删除异常值。是的,谢谢!很抱歉,在我上次发表评论之前,我没有看到您的编辑。
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