如何从数据帧中删除nan, inf和-inf值而不重置模式。use_inf_as_null?
我可以告诉dropna包括inf在其缺失值的定义,以便以下工作?
df.dropna(subset=["col1", "col2"], how="all")
如何从数据帧中删除nan, inf和-inf值而不重置模式。use_inf_as_null?
我可以告诉dropna包括inf在其缺失值的定义,以便以下工作?
df.dropna(subset=["col1", "col2"], how="all")
当前回答
还有一种解决方案是使用isin方法。使用它来确定每个值是无限的还是缺失的,然后链接all方法来确定行中的所有值是无限的还是缺失的。
最后,使用该结果的负数通过布尔索引选择不全是无穷大或缺失值的行。
all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
df[~all_inf_or_nan]
其他回答
首先用NaN替换()infs:
df.replace([np.inf, -np.inf], np.nan, inplace=True)
然后通过dropna()删除nan:
df.dropna(subset=["col1", "col2"], how="all", inplace=True)
例如:
>>> 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
同样的方法也适用于级数。
使用选项上下文,无需永久设置use_inf_as_na就可以实现这一点。例如:
with pd.option_context('mode.use_inf_as_na', True):
df = df.dropna(subset=['col1', 'col2'], how='all')
当然,它可以被设置为永久地将inf视为NaN
pd.set_option('use_inf_as_na', True)
对于旧版本,请将use_inf_as_na替换为use_inf_as_null。
上述解决方案将修改不在目标列中的inf。为了解决这个问题,
lst = [np.inf, -np.inf]
to_replace = {v: lst for v in ['col1', 'col2']}
df.replace(to_replace, np.nan)
还有一种解决方案是使用isin方法。使用它来确定每个值是无限的还是缺失的,然后链接all方法来确定行中的所有值是无限的还是缺失的。
最后,使用该结果的负数通过布尔索引选择不全是无穷大或缺失值的行。
all_inf_or_nan = df.isin([np.inf, -np.inf, np.nan]).all(axis='columns')
df[~all_inf_or_nan]
要使用单个命令删除Nan和inf,请使用
df = df[ np.isfinite( df ).all( axis = 1) ]
如果由于某种原因以上方法对你不起作用,请尝试以下2个步骤:
df = df[ ~( df.isnull().any( axis = 1 ) ) ] #to remove nan
df = df[ ~( df.isin( [np.inf, -np.inf]).any(axis =1) )] #to remove inf