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

问题描述 投票:0回答:2

我有一个大型数据框,不同列中包含 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 值

pandas dataframe replace find inf
2个回答
17
投票

TL;博士


替换
inf
-inf

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

只需确保将结果分配回来即可。 (不要使用

inplace
方法,该方法已通过 PDEP-8 弃用。)

还有其他

df.applymap
选项,但
df.replace
是最快的:

  • 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
(已弃用)

  • 自 pandas 2.1.0 起已弃用
  • 将在pandas 3.0中删除

请注意,我们实际上根本不需要修改

df
。设置
mode.use_inf_as_na
只会改变
inf
-inf
的解释方式:

True
表示将
None
nan
-inf
inf
视为 null
False
表示
None
nan
为空,但
inf
-inf
不为空(默认)

  • 全局启用

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

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

6
投票

pandas.Series.replace
不会发生就地

因此,替换整个数据框的代码的问题不起作用,因为您需要将其分配回来,或者添加

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)

© www.soinside.com 2019 - 2024. All rights reserved.