Pandas处理缺失值分三步:识别缺失值、分析缺失值、处理缺失值(删除缺失值、填充缺失值)
一、识别缺失值
在使用Pandas处理缺失值的时候,第一步是准确识别数据集中有哪些行和列存在缺失值,Pandas提供了isnull和notnull方法来帮助我们识别缺失值。
(1)检查特定值
Pandas使用NaN
(Not a Number)表示缺失值。对于浮点数类型,NaN
遵循IEEE 754标准,而对于其他类型(如整数、字符串等),Pandas会将其转换为float
类型并标记为NaN
。
(2)isnull和notnull()
方法
isnull()
返回一个布尔型DataFrame或Series,其中True表示对应位置存在缺失值,False表示对应位置数据完整。notnull()
与isnull()
相反,返回True表示数据完整,False表示存在缺失值。
missing_mask = df.isnull()
print(missing_mask)
missing_mask = df.notnull()
print(missing_mask)
(3)配合any()检查缺失的行和列
上面介绍了使用isnull()或者notnull()来检测元素有没有缺失数据,但我们大部分时候不关心具体哪个元素缺失。我们只关心哪一行或者那一列是否存在缺失数据。这时候可以配合any()方法来检测,isnull().any(axis=0/1),检查行列中是否存在缺失数据。
# axis=0,对行进行聚合,行消失了,留下了列,所以最终的效果是检查每一列是否存在缺失值
df.isnull().any(axis=0)
# axis=1,对列进行聚合,列消失了,留下了行,所以最终效果是对每一行判断是否有缺失数据
df.isnull().any(axis=1)
二、分析缺失值
在找到缺失值所在的行和列后,和处理缺失值之前,我们得分析缺失值对我们是否重要?缺的多不多?缺失的分布是怎样的?为什么缺?等等问题,能够帮助我们后续选择合适的处理缺失值的方法。
简单介绍分析的思路和可以采取的方法,可以使用sum()
方法计算缺失值的数量,使用info()方法得知哪列有缺失值,
或者使用describe()
方法查看包含缺失值的统计摘要。
三、处理缺失值
(1)删除缺失值
- 缺的数据太多了,比如缺了50%以上
- 缺的数据对我们要做的事情没有任何帮助,相当于是无用数据,可以删掉
# 默认删除行,而且是any逻辑,只要有一个元素是空的,这一行就整个删除
df.dropna()
# 可以通过axis=1改成删除含有缺失值的列数据
df.dropna(axis=1)
# inplace参数,表示原地操作,这里是指直接改变原数组
df.dropna(inplace=True)
# how="all"只有当这一行全部都是空的时候才删除
df.dropna(how="all")
# how参数配合subset参数,可以指定范围内全是空才删除
df.dropna(how="all", subset=['语文', '数学', '英语'])
(2)填充缺失值
根据数据的性质和问题的需求,可以选择不同的填充策略。填充原则:尽量合理,贴近真实情况。
- 使用常数填充:例如,对于某些分类变量,可以使用最常见的类别或特定占位符来填充缺失值。
- 使用均值、中位数或众数填充:对于数值变量,可以使用列的均值、中位数或众数来填充缺失值。
- 使用插值方法填充:对于时间序列数据,可以使用插值方法(如线性插值、多项式插值等)来填充缺失值。
- 使用模型预测填充:可以使用机器学习模型来预测缺失值。
# 1、最简单的方式使用指定的值去填充
df.fillna(value=108) # 全部缺失的值都用固定值来填充
# 2、使用平均数等等统计函数来填充
df_mean = df.mean()
df_mean
# 3、series也可以使用fillna来填充
stu1 = df.iloc[0]
stu1
# 4、用周围上下左右的数据填充
df.fillna(method='ffill', axis=0)
df.fillna(method='ffill', axis=1)
df.fillna(method='bfill', axis=0)
df.fillna(method='bfill', axis=1)