seleccionar recorrer data columnas cleaning python numpy scipy pandas

python - recorrer - arrojando valores infinitos desde dataframes en pandas?



recorrer data frame pandas (5)

Aquí hay otro método que usa .loc para reemplazar inf con nan en una serie:

s.loc[(~np.isfinite(s)) & s.notnull()] = np.nan

Entonces, en respuesta a la pregunta original:

df = pd.DataFrame(np.ones((3, 3)), columns=list(''ABC'')) for i in range(3): df.iat[i, i] = np.inf df A B C 0 inf 1.000000 1.000000 1 1.000000 inf 1.000000 2 1.000000 1.000000 inf df.sum() A inf B inf C inf dtype: float64 df.apply(lambda s: s[np.isfinite(s)].dropna()).sum() A 2 B 2 C 2 dtype: float64

¿Cuál es la forma más rápida / simple de eliminar los valores de nan e inf / -inf de un DataFrame de pandas sin restablecer el mode.use_inf_as_null ? Me gustaría poder usar el subset y how argumentos de dropna , excepto con valores inf considerados como faltantes, como:

df.dropna(subset=["col1", "col2"], how="all", with_inf=True)

¿es posible? ¿Hay alguna manera de decirle a dropna que incluya inf en su definición de valores perdidos?


Con contexto de opción, esto es posible sin establecer permanentemente use_inf_as_null . Por ejemplo:

with pd.option_context(''mode.use_inf_as_null'', True): df = df.dropna(subset=[''col1'', ''col2''], how=''all'')

Por supuesto, se puede configurar para tratar inf como NaN permanentemente con pd.set_option(''use_inf_as_null'', True) también.


La forma más simple sería replace primero infs a NaN:

df.replace([np.inf, -np.inf], np.nan)

y luego usa el dropna :

df.replace([np.inf, -np.inf], np.nan).dropna(subset=["col1", "col2"], how="all")

Por ejemplo:

In [11]: df = pd.DataFrame([1, 2, np.inf, -np.inf]) In [12]: df.replace([np.inf, -np.inf], np.nan) Out[12]: 0 0 1 1 2 2 NaN 3 NaN

El mismo método funcionaría para una serie.


La solución anterior modificará las inf s que no están en las columnas de destino. Para remediar eso,

lst = [np.inf, -np.inf] to_replace = dict((v, lst) for v in [''col1'', ''col2'']) df.replace(to_replace, np.nan)


Otra solución más sería usar el método isin . Úselo para determinar si cada valor es infinito o falta y luego encadene all método para determinar si todos los valores en las filas son infinitos o faltan.

Finalmente, use la negación de ese resultado para seleccionar las filas que no tienen todos los valores infinitos o perdidos a través de la indexación booleana.

all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis=''columns'') df[~all_inf_or_nan]