我有一个大型数据框,不同列中包含 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 值
df.replace
替换速度最快 ±inf
mode.use_inf_as_na
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
(已弃用)请注意,我们实际上根本不需要修改
df
。设置 mode.use_inf_as_na
只会改变 inf
和 -inf
的解释方式:
表示将True
、None
、nan
、-inf
视为 nullinf
表示False
和None
为空,但nan
、inf
不为空(默认)-inf
全局启用
pd.set_option('mode.use_inf_as_na', True)
或通过上下文管理器在本地
with pd.option_context('mode.use_inf_as_na', True):
...
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)