wake-up-neo.net

Python-Pandas: So entfernen Sie Nan- und -inf-Werte

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? 

12
user2154227

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
19
piRSquared

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.

13
Alexander
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)]
1
DougR