Python pandas: cómo eliminar los valores nan y -inf

Tengo el siguiente dataframe

time XY 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 

Probé con lo siguiente

 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) 

Sin embargo, todavía recibo este error ValueError: Input contains NaN, infinity or a value too large for dtype('float32'). cada vez que bash ajustar un modelo de regresión fit(X_train, y_train)

¿Cómo podemos eliminar los valores de NaN e -inf al mismo tiempo?

Use pd.DataFrame.isin y pd.DataFrame.isin filas que tengan alguna con pd.DataFrame.any . Finalmente, use la matriz booleana para dividir el dataframe.

 df[~df.isin([np.nan, np.inf, -np.inf]).any(1)] time XY 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 

Puede reemplazar inf e -inf con NaN , y luego seleccionar filas no nulas.

 df[df.replace([np.inf, -np.inf], np.nan).notnull().all(axis=1)] # .astype(np.float64) ? 

o

 df.replace([np.inf, -np.inf], np.nan).dropna(axis=1) 

Verifique el tipo de retornos de sus columnas para asegurarse de que sean todos los esperados (por ejemplo, np.float32 / 64) a través de df.info() .

En lugar de eliminar filas que contengan nulos y números infinitos, es más sucinto revertir la lógica de eso y, en cambio, devolver las filas donde todas las celdas son números finitos. La función numpy isfinite hace esto y ‘.all (1)’ solo devolverá TRUE si todas las celdas de la fila son finitas.

 df = df[np.isfinite(df).all(1)] 
 df.replace([np.inf, -np.inf], np.nan) df.dropna(inplace=True)