2017-05-31 11 views
1

私のコードは、時系列で異常値を検出します。私がしたいのは、最初のデータフレーム列の外れ値を外れ値ではない前の値に置き換えることです。 パンダのデータフレーム列の値を前の値に置き換えます

  • Trueは、データフレームの値が外れ値
  • Falseは、データフレームの値が外れ値
  • されないことを意味することを意味する:

    このコードは、単にブール配列を作成し、外れ値を検出します

series = read_csv('horario_completo.csv', header=None, squeeze=True) 
df=pd.DataFrame(series) 
from pandas import rolling_median 

consumos=df.iloc[:,0] 
df['rolling_median'] = rolling_median(consumos, window=48, center=True).fillna(method='bfill').fillna(method='ffill') 
threshold =50 
difference = np.abs(consumos - df['rolling_median']) 
outlier = difference > threshold 

これまで、すべてが機能します。

私が考えているのは、Trueの値を同じ列の以前の値に置き換えるマスクを作成することです(これが可能であれば、ループを作るよりもはるかに高速です)。

私は少し例を挙げてそれを説明してみましょう:

これは私が持っているものです。

index consumo 

    0  54 
    1  67 
    2  98 


index outlier 

    0 False 
    1 False 
    2 True 

そして、これは私が何をしたいです:

index consumo 

    0  54 
    1  67 
    2  67 

私はこのようなマスクを作成する必要があると思います。

df.mask(outlier, df.columns=[[0]][i-1],axis=1) 
obvioslyこれは、それを書く方法ではありません

。私はそれができると思う方法についての説明です(私は[i-1]について話しています)。

答えて

1

あなたがshiftを必要とするようだ:

consumo = consumo.mask(outlier, consumo.shift()) 
print (consumo) 
0 54.0 
1 67.0 
2 67.0 
Name: consumo, dtype: float64 

最終値がすべてintsastypeを追加している場合:

consumo = consumo.mask(outlier, consumo.shift()).astype(int) 
print (consumo) 
0 54 
1 67 
2 67 
Name: consumo, dtype: int32 
+0

私はシフト(の存在を知りませんでした)。本当に本当に便利です。あなたの答えははっきりしていて、本当にうまくいきます。どうもありがとうございました。 – Jvr

+0

うれしいことに、うれしい1日! – jezrael

関連する問題