从 pandas 数据帧 python 中移除异常值
Remove outliers from pandas dataframe python
我有一个使用 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 个异常值,我想在不弄乱原始数据帧的情况下删除它们,然后将它们作为压缩图绘制在一起。
我的问题是:因此,与其打印出 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
这两个都不起作用,它们 returns 与我的原始数据框相同数量的数据点但是我知道如果它删除异常值,点的数量将少于原始数据。
看来您需要 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
我有一个使用 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 个异常值,我想在不弄乱原始数据帧的情况下删除它们,然后将它们作为压缩图绘制在一起。 我的问题是:因此,与其打印出 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
这两个都不起作用,它们 returns 与我的原始数据框相同数量的数据点但是我知道如果它删除异常值,点的数量将少于原始数据。
看来您需要 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