Ich habe den folgenden Datenrahmen
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
Ich habe es mit folgendem versucht
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)
Ich erhalte jedoch immer noch diese Fehlermeldung ValueError: Input contains NaN, infinity or a value too large for dtype('float32').
, wenn ich versuche, ein Regressionsmodell anzupassen fit(X_train, y_train)
Wie können wir die NaN
- und -inf
-Werte gleichzeitig entfernen?
Verwenden Sie pd.DataFrame.isin
und prüfen Sie, ob Zeilen mit pd.DataFrame.any
vorhanden sind. Verwenden Sie schließlich das boolesche Array, um den Datenrahmen zu schneiden.
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
Sie können inf
und -inf
durch NaN
ersetzen und dann Nicht-Null-Zeilen auswählen.
df[df.replace([np.inf, -np.inf], np.nan).notnull().all(axis=1)] # .astype(np.float64) ?
oder
df.replace([np.inf, -np.inf], np.nan).dropna(axis=1)
Überprüfen Sie den Typ Ihrer Spaltenrückgaben, um sicherzustellen, dass sie alle wie erwartet (z. B. np.float32/64) über df.info()
sind.
df.replace([np.inf, -np.inf], np.nan)
df.dropna(inplace=True)
Anstatt Zeilen zu löschen, die Nullen und unendliche Zahlen enthalten, ist es knapper, die Logik umzukehren und stattdessen die Zeilen zurückzugeben, bei denen alle Zellen endliche Zahlen sind. Die numpy isfinite-Funktion führt dies aus und die '.all (1)' gibt nur dann WAHR zurück, wenn all Zellen in der Zeile endlich sind.
df = df[np.isfinite(df).all(1)]