Python中的缺失值

  • 1、情景描述
  • 2、Python中的缺失值
  • 3、如何检查Python中的缺失值


1、情景描述


在使用Pandas中的文件读取API读取Excel、CSV或TXT等文件时,我们可能需要对读取到的数据进行简单清洗。例如,将其中的表示空值的字符串替换为真正意义上的缺失值

来看一个例子:

data = pd.read_table(path,sep)
data.replace(['Null', 'None', 'NaN'], np.NaN, inplace=True)

上述代码中的Null、None、NaN都是文件中表示空值的字符串,我们使用replace()方法将它们替换为缺失值

实际上,Pandas读取API会自动将一些Python认识的表示空值的字符串解析为缺失值np.NaN,也许上述的replace()方法多余了

那么,到底哪些字符串可以表示Python中的缺失值呢?

2、Python中的缺失值


Python中的缺失值包括但不限于有如下:

import numpy as np
import pandas as pd

print(np.NaN)             # NaN
print(type(np.NaN))       # <class 'float'>
print(pd.isnull(np.NaN))  # True
print(pd.isna(np.NaN))    # True

print(np.nan)             # NaN
print(type(np.nan))       # <class 'float'>
print(pd.isnull(np.nan))  # True
print(pd.isna(np.nan))    # True

print(pd.NA)              # <NA>
print(type(pd.NA))        # <class 'pandas._libs.missing.NAType'>
print(pd.isnull(pd.NA))   # True
print(pd.isna(pd.NA))     # True

# 时间格式的缺失值
print(pd.NaT)             # NaT
print(type(pd.NaT))       # <class 'pandas._libs.tslibs.nattype.NaTType'>
print(pd.isnull(pd.NaT))  # True
print(pd.isna(pd.NaT))    # True

print(None)               # None
print(type(None))         # <class 'NoneType'>
print(pd.isnull(None))    # True
print(pd.isna(None))      # True

# 空字符串不是缺失值
print('')                 #
print(type(''))           # <class 'str'>
print(pd.isnull(''))      # False
print(pd.isna(''))        # False

经验证,Pandas能自动识别的Python缺失值字符串有:None、NA、nan、NaN、null、NULL、N/A、<NA>、''等,不能自动识别的缺失值字符串有:na、Na、none、Null

因此,情景描述中的NoneNaN字符串无需使用replace()进行替换,而Null需要使用replace()替换,全大写和全小写的NULLnull也无需进行替换

感兴趣的同学快去试试吧

3、如何检查Python中的缺失值


在数据处理时,通常我们需要先对数据中的缺失值进行处理。Python提供了多种方法来检查单个值、数组列表、Series对象的缺失值

来看这样一个情景:

import numpy as np
import pandas as pd

# 数据
df = pd.DataFrame({'key': [1, 2, 3, np.NaN], 'val': [0, False, None, np.NaN]})
print(df.to_string())
'''
   key    val
0  1.0      0
1  2.0  False
2  3.0   None
3  NaN    NaN
'''

# val列中是否包含缺失值(如NaN)
print(np.NaN in df.iloc[:, 1].tolist())   # True
print(np.NaN in df['val'].tolist())       # True
print(np.NaN in df['val'].values)         # False
print(True in df['val'].isnull().values)  # True

结合上述情景,下面介绍常用的两种检查方式:

1)np.isnan()

np.isnan()可用于检查单个值、数组列表、Series对象的缺失值(单个值或数组列表元素的类型仅限于Number类型)。单个值返回True或False;类似数组的对象返回一个与输入形状相同的布尔数组

print(np.isnan(np.NaN))    # True
# 由于None的类型为NoneType(非Number类型),所以None或包含None的数组列表执行将报错
print(np.isnan(None))      # 报错
print(np.isnan(df['val'].values))    # 报错
print(np.isnan(df['key'].values))    # [False False False True]

2)pd.isna()

pd.isna()可用于检查单个值、数组列表、Pandas数据结构(如Series、DataFrame)对象的缺失值(待检查的缺失值仅限于NaN、None或NaT)。单个值返回True或False;类似数组的对象返回一个与输入形状相同的布尔数组

print(pd.isna([None]))     # [True]
print(pd.isna(np.NaN))     # True
print(pd.isna(pd.NaT))     # True
print(pd.isna(df['val'].values))     # [False False True True]