2017-08-02 148 views
2

我有一個創建使用熊貓從熊貓數據框中蟒蛇刪除離羣

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 

這打印ou T:

   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

看來你需要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 
+0

當我想你的答案,我得到一個數值錯誤:'提高ValueError異常(MSG .format(dtype = dt)) ValueError:條件的預期布爾數組,不是float64' –

+0

什麼返回'print(df.groupby('Data')。transform(lambda x:abs(xx.mean())> 1.96 * x.std()))'?不是「真假系列」? – jezrael

+0

我發現問題,你需要'.values'將系列轉換爲numpy數組。 – jezrael