Python Pandas - 缺失数据



在现实生活中,尤其是在机器学习和数据分析等领域,缺失数据始终是一个问题。缺失值会严重影响模型和分析的准确性,因此正确处理它们至关重要。本教程将介绍如何在 Python Pandas 中识别和处理缺失数据。

数据缺失的时机和原因?

考虑一下对某个产品进行在线调查的场景。很多时候,人们不会分享所有与他们相关的信息,他们可能会跳过一些问题,导致数据不完整。例如,有些人可能会分享他们对产品的体验,但不会分享他们使用该产品的时间长短,反之亦然。在这样的实时场景中,缺失数据是经常发生的,有效地处理它至关重要。

在 Pandas 中表示缺失数据

Pandas 使用不同的哨兵值来表示缺失数据 (NA 或 NaN),具体取决于数据类型。

  • numpy.nan:用于 NumPy 数据类型。当在整数或布尔数组中引入缺失值时,数组将升级为np.float64object,因为NaN是一个浮点值。

  • NaT:用于 np.datetime64、np.timedelta64 和 PeriodDtype 中缺失的日期和时间。NaT 代表“非时间”。

  • <NA>:对于 StringDtype、Int64Dtype、Float64Dtype、BooleanDtype 和 ArrowDtype,这是一个更灵活的缺失值表示。当引入缺失值时,此类型会保留原始数据类型。

示例

现在让我们看看 Pandas 如何表示不同数据类型的缺失数据。

import pandas as pd
import numpy as np

ser1 = pd.Series([1, 2], dtype=np.int64).reindex([0, 1, 2])
ser2 = pd.Series([1, 2], dtype=np.dtype("datetime64[ns]")).reindex([0, 1, 2])
ser3 = pd.Series([1, 2], dtype="Int64").reindex([0, 1, 2])

df = pd.DataFrame({'NumPy':ser1, 'Dates':ser2, 'Others':ser3} )
print(df)

输出如下:

NumPy Dates Others
1.0 1970-01-01 00:00:00.000000001 1
2.0 1970-01-01 00:00:00.000000002 2
NaN NaT <NA>

检查缺失值

Pandas 提供了isna()notna()函数来检测缺失值,这些函数适用于不同的数据类型。这些函数返回一个布尔 Series,指示缺失值的存在。

示例

以下示例使用isna()方法检测缺失值。

import pandas as pd
import numpy as np

ser = pd.Series([pd.Timestamp("2020-01-01"), pd.NaT])
print(pd.isna(ser))

执行上述代码后,我们将得到以下输出:

0    False
1     True
dtype: bool

需要注意的是,使用isna()notna()时,None也被视为缺失值。

使用缺失数据进行计算

当使用缺失数据进行计算时,Pandas 将NA视为零。如果计算中的所有数据都是NA,则结果将为NA

示例

此示例计算 DataFrame “one”列中包含缺失数据的数值之和。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])

print(df['one'].sum())

输出如下:

2.02357685917

替换/填充缺失数据

Pandas 提供了几种处理缺失数据的方法。一种常见的方法是使用fillna()方法替换缺失值为特定值。

示例

以下程序演示了如何使用fillna()方法将 NaN 替换为标量值(将“NaN”替换为“0”)。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(3, 3), index=['a', 'c', 'e'],columns=['one',
'two', 'three'])

df = df.reindex(['a', 'b', 'c'])

print("Input DataFrame:\n",df)
print("Resultant DataFrame after NaN replaced with '0':")
print(df.fillna(0))

输出如下:

Input DataFrame:
one two three
a 0.188006 -0.685489 -2.088354
b NaN NaN NaN
c -0.446296 2.298046 0.346000
Resultant DataFrame after NaN replaced with '0':
one two three
a 0.188006 -0.685489 -2.088354
b 0.000000 0.000000 0.000000
c -0.446296 2.298046 0.346000

删除缺失值

如果您想简单地排除缺失值而不是替换它们,请使用dropna()函数删除缺失值

示例

此示例使用dropna()函数删除缺失值。

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f',
'h'],columns=['one', 'two', 'three'])

df = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
print(df.dropna())

输出如下:

one two three
a 0.170497 -0.118334 -1.078715
c 0.326345 -0.180102 0.700032
e 1.972619 -0.322132 -1.405863
f 1.760503 -1.179294 0.043965
h 0.747430 0.235682 0.973310
广告