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
等
因此,情景描述中的None
和NaN
字符串无需使用replace()
进行替换,而Null
需要使用replace()
替换,全大写和全小写的NULL
和null
也无需进行替换
感兴趣的同学快去试试吧
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]