¿Dejar caer valores infinitos de marcos de datos en pandas?
Resuelto
asked hace 11 años
•
10 respuestas
¿Cómo elimino los valores nan
, inf
y -inf
de a DataFrame
sin restablecerlos mode.use_inf_as_null
?
¿Puedo indicar dropna
que se incluyan inf
en su definición los valores faltantes para que funcione lo siguiente?
df.dropna(subset=["col1", "col2"], how="all")
Aceptado
Primeras replace()
infs con NaN:
df.replace([np.inf, -np.inf], np.nan, inplace=True)
y luego suelte NaN a través de dropna()
:
df.dropna(subset=["col1", "col2"], how="all", inplace=True)
Por ejemplo:
>>> df = pd.DataFrame({"col1": [1, np.inf, -np.inf], "col2": [2, 3, np.nan]})
>>> df
col1 col2
0 1.0 2.0
1 inf 3.0
2 -inf NaN
>>> df.replace([np.inf, -np.inf], np.nan, inplace=True)
>>> df
col1 col2
0 1.0 2.0
1 NaN 3.0
2 NaN NaN
>>> df.dropna(subset=["col1", "col2"], how="all", inplace=True)
>>> df
col1 col2
0 1.0 2.0
1 NaN 3.0
El mismo método también funciona para Series
.
Con la opción contexto, esto es posible sin configurarlo permanentemente use_inf_as_na
. Por ejemplo:
with pd.option_context('mode.use_inf_as_na', True):
df = df.dropna(subset=['col1', 'col2'], how='all')
Por supuesto, se puede configurar para que se trate inf
de forma NaN
permanente con
pd.set_option('use_inf_as_na', True)
Para versiones anteriores, reemplácelas use_inf_as_na
con use_inf_as_null
.
Uso (rápido y sencillo):
df = df[np.isfinite(df).all(1)]
Esta respuesta se basa en la respuesta de DougR en otra pregunta. Aquí un código de ejemplo:
import pandas as pd
import numpy as np
df=pd.DataFrame([1,2,3,np.nan,4,np.inf,5,-np.inf,6])
print('Input:\n',df,sep='')
df = df[np.isfinite(df).all(1)]
print('\nDropped:\n',df,sep='')
Resultado:
Input:
0
0 1.0000
1 2.0000
2 3.0000
3 NaN
4 4.0000
5 inf
6 5.0000
7 -inf
8 6.0000
Dropped:
0
0 1.0
1 2.0
2 3.0
4 4.0
6 5.0
8 6.0