私は次のデータフレームを持っています
time X Y X_t0 X_tp0 X_t1 X_tp1 X_t2 X_tp2
0 0.002876 0 10 0 NaN NaN NaN NaN NaN
1 0.002986 0 10 0 NaN 0 NaN NaN NaN
2 0.037367 1 10 1 1.000000 0 NaN 0 NaN
3 0.037374 2 10 2 0.500000 1 1.000000 0 NaN
4 0.037389 3 10 3 0.333333 2 0.500000 1 1.000000
5 0.037393 4 10 4 0.250000 3 0.333333 2 0.500000
....
1030308 9.962213 256 268 256 0.000000 256 0.003906 255 0.003922
1030309 10.041799 0 268 0 -inf 256 0.000000 256 0.003906
1030310 10.118960 0 268 0 NaN 0 -inf 256 0.000000
私は次のことを試しました
df.dropna(inplace=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.40)
X_train = X_train.drop('time', axis=1)
X_train = X_train.drop('X_t1', axis=1)
X_train = X_train.drop('X_t2', axis=1)
X_test = X_test.drop('time', axis=1)
X_test = X_test.drop('X_t1', axis=1)
X_test = X_test.drop('X_t2', axis=1)
X_test.fillna(X_test.mean(), inplace=True)
X_train.fillna(X_train.mean(), inplace=True)
y_train.fillna(y_train.mean(), inplace=True)
ただし、回帰モデルValueError: Input contains NaN, infinity or a value too large for dtype('float32').
を近似しようとするたびに、このエラーfit(X_train, y_train)
が発生します。
NaN
と-inf
の両方の値を同時に削除するにはどうすればよいですか?
pd.DataFrame.isin
を使用し、pd.DataFrame.any
で任意の行をチェックします。最後に、ブール配列を使用してデータフレームをスライスします。
df[~df.isin([np.nan, np.inf, -np.inf]).any(1)]
time X Y X_t0 X_tp0 X_t1 X_tp1 X_t2 X_tp2
4 0.037389 3 10 3 0.333333 2.0 0.500000 1.0 1.000000
5 0.037393 4 10 4 0.250000 3.0 0.333333 2.0 0.500000
1030308 9.962213 256 268 256 0.000000 256.0 0.003906 255.0 0.003922
inf
と-inf
をNaN
に置き換えてから、null以外の行を選択できます。
df[df.replace([np.inf, -np.inf], np.nan).notnull().all(axis=1)] # .astype(np.float64) ?
または
df.replace([np.inf, -np.inf], np.nan).dropna(axis=1)
df.info()
を使用して、列の戻り値の型をチェックし、すべてが期待どおりであることを確認します(例:np.float32/64)。
df.replace([np.inf, -np.inf], np.nan)
df.dropna(inplace=True)
ヌルと無限数を含む行をドロップする代わりに、その論理を逆にして、代わりにすべてのセルが有限数である行を返す方が簡潔です。 numpy isfinite関数はこれを行い、 '。all(1)'は、行のallセルが有限の場合にのみTRUEを返します。
df = df[np.isfinite(df).all(1)]