将 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
df.replace
替换 ±inf
最快
- 但是你可以通过设置
mode.use_inf_as_na
来避免完全替换
替换 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)
我有一个大型数据框,在不同的列中包含 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
df.replace
替换±inf
最快
- 但是你可以通过设置
mode.use_inf_as_na
来避免完全替换
替换 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 treatNone
,nan
,-inf
,inf
as null
False
meansNone
andnan
are null, butinf
,-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)