60_Pandas中是否包含判断缺失值NaN并统计个数
下面介绍如何判断pandas.DataFrame、Series是否包含缺失值NaN以及如何统计缺失值NaN的个数。
- 使用 isnull()、isna() 确定每个元素的缺失值
- 判断每一行/列的所有元素是否缺失值
- 判断每一行/列是否至少包含一个缺失值
- 计算每行/列的缺失值
- 计算每行/列的非缺失元素的数量
- 计算缺失值总数
- 计算非缺失元素的总数
- 判断整体是否至少有一个缺失值
- pandas.Series
使用 read_csv() 读取包含空白的 CSV 文件。仅使用前三行。
import pandas as pd
df = pd.read_csv('data/sample_pandas_normal_nan.csv')[:3]
print(df)
# name age state point other
# 0 Alice 24.0 NY NaN NaN
# 1 NaN NaN NaN NaN NaN
# 2 Charlie NaN CA NaN NaN
- 使用 isnull()、isna() 确定每个元素的缺失值
如果值为 NaN,则值为 True,如果不是,则值为 False。
print(df.isnull())
# name age state point other
# 0 False False False True True
# 1 True True True True True
# 2 False True False True True
print(df.isna())
# name age state point other
# 0 False False False True True
# 1 True True True True True
# 2 False True False True True
isnull() 是 isna() 的别名,两者用法相同。之后主要是用isnull(),不过可以用isna()代替。
相反,如果值不是 NaN,则有方法 notnull() 和 notna() 返回 True,如果值缺失则返回 False。 notnull() 是 notna() 的别名,两者用法相同。
print(df.notnull())
# name age state point other
# 0 True True True False False
# 1 False False False False False
# 2 True False True False False
print(df.notna())
# name age state point other
# 0 True True True False False
# 1 False False False False False
# 2 True False True False False
注意,对于缺失值 NaN,== 返回 False 而 != 对所有值(包括 NaN 本身)返回 True。请注意,== 和 != 无法检测缺失值。
print(df == float('nan'))
# name age state point other
# 0 False False False False False
# 1 False False False False False
# 2 False False False False False
print(df != float('nan'))
# name age state point other
# 0 True True True True True
# 1 True True True True True
# 2 True True True True True
- 判断每一行/列的所有元素是否缺失值
all() 是一种方法,如果每行/列中的所有元素都为真,则确定为真。从 pandas.DataFrame 调用时返回 pandas.Series。
通过将 all() 应用于 isnull() 的结果,可以确定每行和每列的所有元素是否都是缺失值 NaN。
默认情况下为列,参数为 axis=1 的行。
print(df.isnull().all())
# name False
# age False
# state False
# point True
# other True
# dtype: bool
print(df.isnull().all(axis=1))
# 0 False
# 1 True
# 2 False
# dtype: bool
- 判断每一行/列是否至少包含一个缺失值
any() 是一种确定 True 的方法,如果每行/列甚至有一个 True。从 pandas.DataFrame 调用时返回 pandas.Series。
print(df.isnull().any())
# name True
# age True
# state True
# point True
# other True
# dtype: bool
print(df.isnull().any(axis=1))
# 0 True
# 1 True
# 2 True
# dtype: bool
- 计算每行/列的缺失值
sum() 是一种计算每行/列总数的方法。从 pandas.DataFrame 调用时返回 pandas.Series。
由于sum()被处理为True=1,False=0,通过对isnull()的结果应用sum(),我们可以统计每行和每列缺失值NaN的个数。
默认情况下为列,参数为 axis=1 的行。
print(df.isnull().sum())
# name 1
# age 2
# state 1
# point 3
# other 3
# dtype: int64
print(df.isnull().sum(axis=1))
# 0 2
# 1 5
# 2 3
# dtype: int64
- 计算每行/列的非缺失元素的数量
count() 是一种方法,它计算每一行/列中不属于缺失值 NaN 的元素的数量。从 pandas.DataFrame 调用时返回 pandas.Series。
直接从原始 pandas.DataFrame 调用它,而不是 isnull() 的结果。
默认情况下为列,参数为 axis=1 的行。
print(df.count())
# name 2
# age 1
# state 2
# point 0
# other 0
# dtype: int64
print(df.count(axis=1))
# 0 3
# 1 0
# 2 2
# dtype: int64
- 计算缺失值总数
可以通过pandas.DataFrame的values属性获取整个元素的数据作为NumPy数组numpy.ndarray。
print(df.isnull().values)
# [[False False False True True]
# [ True True True True True]
# [False True False True True]]
print(type(df.isnull().values))
# <class 'numpy.ndarray'>
与 pandas.DataFrame 方法 sum() 不同,numpy.ndarray 方法 sum() 默认计算总和。
因此,从isnull()结果的values属性(numpy.ndarray)调用sum(),可以得到缺失值的总数(total number)。
print(df.isnull().values.sum())
# 10
- 计算非缺失元素的总数
对于count()可以得到的每一行或每一列,可以通过sum()计算非缺失元素的总数。
print(df.count().sum())
# 5
可以从 notnull() 或 notna() 产生的值属性 (numpy.ndarray) 调用 sum()(对于非缺失元素为真)。
print(df.notnull().values.sum())
# 5
- 判断整体是否至少有一个缺失值
上面给出的缺失值总数可以用来判断总数是否包含缺失值。 如果缺失值总数不为0,则至少存在一个缺失值NaN。
print(df.isnull().values.sum() != 0)
# True
如果缺失值总数等于size属性(元素总数),则所有元素都是缺失值NaN。
print(df.size)
# 15
print(df.isnull().values.sum() == df.size)
# False
- pandas.Series
pandas.Series还有isnull()、isna()、notnull()、notna()等方法。可以像前面的例子一样处理。
s = df['state']
print(s)
# 0 NY
# 1 NaN
# 2 CA
# Name: state, dtype: object
print(s.isnull())
# 0 False
# 1 True
# 2 False
# Name: state, dtype: bool
print(s.notnull())
# 0 True
# 1 False
# 2 True
# Name: state, dtype: bool
print(s.isnull().any())
# True
print(s.isnull().all())
# False
print(s.isnull().sum())
# 1
print(s.count())
# 2