理解 Numpy 和 Pandas 中的 NaN

NaN 是Not a number的缩写它用于表示未定义的条目。它还用于表示数据集中的缺失值。

NaN 的概念甚至在 Python 创建之前就已经存在。IEEE 浮点算术标准 (IEEE 754) 于 1985 年引入了 NaN。

NaN 是一种特殊的浮点值,不能转换为除 float 之外的任何其他类型。

在本教程中,我们将了解 NaN 在 Pandas 和 Numpy 中的工作原理。

Numpy 中的 NaN

让我们看看 NaN 在Numpy下如何工作。为了观察 NaN 的属性,让我们创建一个包含 NaN 值的 Numpy 数组。

import numpy as np
arr = np.array([1, np.nan, 3, 4, 5, 6, np.nan])
pritn(arr)

输出 :

[ 1. nan  3.  4.  5.  6. nan]

1. Numpy 数组上 NaN 的数学运算

让我们尝试在Numpy 数组上调用一些基本函数。

print(arr.sum())

输出 :

nan

让我们尝试从数组中找到最大值

print(arr.max())

输出 :

nan

值得庆幸的是,Numpy 提供了在执行数学运算时忽略 NaN 值的方法。

2. 在 Numpy 数组上执行数学运算时如何忽略 NaN 值

Numpy 为您提供了 np.nansum() 和 np.nanmax() 等方法来在忽略数组中的 NaN 值后计算总和和最大值。

np.nansum(arr)

输出 :

19.0
np.nanmax(arr)
6.0

如果您在 IDE 中启用了自动补全功能,那么在使用 np.nan 时您将看到以下选项列表:

纳米粒子

3. 检查 NaN 值

要检查 Numpy 数组中的 NaN 值,可以使用 np.isnan() 方法。

这会输出原始数组大小的布尔掩码。

np.isnan(arr)

输出 :

[False  True False False False False  True]

输出数组对于原始数组中为 NaN 的索引为 true,对于其余索引为 false。

4. 使两个nan相等

两个 NaN 彼此相等吗?

这可能是一个令人困惑的问题。让我们尝试通过运行一些 python 代码来回答这个问题。

a = np.nan
b = np.nan

这两条语句用 nan 初始化两个变量 a 和 b。让我们尝试将两者等同起来。

a == b

输出 :

False

在 Python 中,我们也有is运算符。让我们尝试用它来比较两个变量。

a is b

输出 :

True

原因是 == 运算符比较两个操作数的值并检查值是否相等。is operator另一方面,检查两个操作数是否引用同一个对象。

事实上,你可以打印出 a 和 b 的 ID,发现它们引用的是同一个对象。

id(a)

输出 :

139836725842784
id(b)

输出 :

139836725842784

Pandas Dataframe 中的 NaN

Pandas DataFrame是将数据导入 python 的常见方法。让我们看看如何处理Pandas Dataframe 中的 NaN 值。

让我们从创建一个数据框开始。

s = pd.DataFrame([(0.0, np.nan, -2.0, 2.0),
...                    (np.nan, 2.0, np.nan, 1),
...                    (2.0, 5.0, np.nan, 9.0),
...                    (np.nan, 4.0, -3.0, 16.0)],
...                   columns=list('abcd'))
s

输出 :

数据框

1. 检查 NaN 值

您可以使用isnull() 方法检查 NaN 值输出将是一个布尔掩码,其尺寸与原始数据帧相同。

s.isnull()

输出 :

一片空白

2. 替换 NaN 值

有多种方法可以替换 Pandas Dataframe 中的 NaN 值。最常见的方法是使用.fillna() 方法。

此方法要求您指定一个值来替换 NaN。

s.fillna(0)

输出 :

菲尔纳(0)

或者,您也可以按列提及这些值。这意味着一列下的所有 NaN 将被替换为相同的值。

values = {'a': 0, 'b': 1, 'c': 2, 'd': 3}
s.fillna(value=values)

输出 :

您还可以使用插值来填充数据框中的缺失值。与 .fillna() 相比,插值是一种稍微高级的方法。

插值是一种可以估计两个已知数据点之间的未知数据点的技术。

3. 删除包含 NaN 值的行

要删除带有 NaN 的行或列,您可以使用.dropna()方法。

要删除包含 NaN 的行,请使用:

df.dropna()

要删除包含 NaN 的列,请使用:

df.dropna(axis='columns')

结论

本教程是关于 Python 中的 NaN。我们主要关注 Numpy 和 Pandas 中 NaN 的处理。希望您和我们一起学习愉快。