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]