列がいくつかあるパンダデータフレームがあります。特定の列の値に基づいて、特定の行が外れ値であることがわかりました。たとえば、列のVol
すべての値が 12xx 付近にあり、1 つの値が 4000 (外れ値) です。このような列を持つ行を除外したいと思いますVol
。
したがって、基本的には、特定の列の値が平均から 3 標準偏差以内にあるすべての行を選択するように、データ フレームにフィルターを適用する必要があります。
これを実現するためのエレガントな方法は何でしょうか?
ベストアンサー1
使用scipy.stats.zscore
少なくとも1つの列に外れ値がある行をすべて削除します
データフレームに複数の列があり、少なくとも 1 つの列に外れ値があるすべての行を削除する場合は、次の式を使用すると 1 回でそれが実行されます。
import pandas as pd
import numpy as np
from scipy import stats
df = pd.DataFrame(np.random.randn(100, 3))
df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]
説明:
- 各列について、まず列の平均と標準偏差を基準にして、列内の各値の Z スコアを計算します。
- 次に、方向は関係なく、しきい値を下回る場合にのみ絶対 Z スコアを取得します。
( < 3).all(axis=1)
各行のすべての列の値が平均から3標準偏差以内であるかどうかを確認します。- 最後に、この条件の結果を使用してデータフレームのインデックスが作成されます。
1つの列に基づいて他の列をフィルタリングする
上記と同じですが、 の列zscore
(df[0]
例) を指定し、 を削除します.all(axis=1)
。
df[np.abs(stats.zscore(df[0])) < 3]