将 pandas 数据框中的所有 inf、-inf 值替换为 NaN

Replace all inf, -inf values with NaN in a pandas dataframe

我有一个大型数据框,在不同的列中包含 inf、-inf 值。我想用 NaN

替换所有 inf、-inf 值

我可以逐列这样做。所以这有效:

df['column name'] = df['column name'].replace(np.inf, np.nan)

但是我的代码无法一次性完成整个数据帧。

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

输出不替换 inf 值

TL;DR


替换 inf-inf

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

请注意 inplace 是可能的,但 not recommended and will soon be deprecated.

较慢的 df.applymap 选项:

  • df = df.applymap(lambda x: np.nan if x in [np.inf, -np.inf] else x)
  • df = df.applymap(lambda x: np.nan if np.isinf(x) else x)
  • df = df.applymap(lambda x: x if np.isfinite(x) else np.nan)

设置mode.use_inf_as_na

请注意,实际上我们根本不需要修改 df。设置 mode.use_inf_as_na 只会改变 inf-inf 的解释方式:

True means treat None, nan, -inf, inf as null
False means None and nan are null, but inf, -inf are not null (default)

  • 要么全局启用

    pd.set_option('mode.use_inf_as_na', True)
    
  • 或在本地通过上下文管理器

    with pd.option_context('mode.use_inf_as_na', True):
        ...
    

pandas.Series.replace doesn't happen .

所以你的代码替换整个数据框的问题不起作用,因为你需要将它分配回去,或者添加 inplace=True 作为参数。这也是您逐列工作的原因,因为您将其分配回 df['column name'] = ...

因此,将 df.replace([np.inf, -np.inf], np.nan) 更改为:

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

或者分配回一个新的数据帧:

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