Pandas处理缺失值:判断、过滤与填充完整指南
本文详细介绍Pandas中处理缺失值的核心方法。涵盖如何识别Series和DataFrame中的NaN与None,使用dropna按行或列过滤数据,以及通过fillna进行指定值、前后向或均值填充。掌握这些技巧可提升数据清洗效率。
Pandas处理缺失值:判断、过滤与填充完整指南
在实际数据分析场景中,缺失值现象十分常见。为了有效利用数据,我们需要掌握Pandas提供的处理手段,主要包括过滤和填充两种策略。
一、缺失值的判断
一、缺失值的判断
Pandas使用浮点值NaN(Not a Number)来代表浮点数和非浮点数组中的缺失数据,同时Python内置的None值也会被识别为缺失值。
a、Series的缺失值判断
a、Series的缺失值判断
s = Series(["a","b",np.nan,"c",None])
print(s)
'''
0 a
1 b
2 NaN
3 c
4 None
'''
#判断缺失值,如果是则返回True,否则返回False
print(s.isnull())
'''
0 False
1 False
2 True
3 False
4 True
'''
#输出缺失值的索引和值
print(s[s.isnull()])
'''
2 NaN
4 None
'''
b、DataFrame的缺失值判断
b、DataFrame的缺失值判断
a = [[1,np.nan,2],[3,4,None]]
data = DataFrame(a)
#DataFrame的None值变成了NaN
print(data)
'''
0 1 2
0 1 NaN 2.0
1 3 4.0 NaN
'''
print(data.isnull())
'''
0 1 2
0 False True False
1 False False True
'''
print(data[data.isnull()])
'''
0 1 2
0 NaN NaN NaN
1 NaN NaN NaN
'''
需要注意的是,当Series和DataFrame中包含None值时,Series会直接输出None,而DataFrame会将其转换为NaN。尽管显示形式不同,但对空值的判断逻辑一致。使用isnull方法时,DataFrame在输出空值位置会统一显示为NaN,因为对于False对应的位置,DataFrame会用NaN替代输出,而Series在False对应位置则不显示值。
二、过滤缺失数据
二、过滤缺失数据
a、Series的缺失值过滤
a、Series的缺失值过滤
s = Series(["a","b",np.nan,"c",None])
#通过使用notnull方法来获取非缺失数据
print(s[s.notnull()])
'''
0 a
1 b
3 c
'''
#使用dropna方法删除缺失数据,返回一个删除后的Series
print(s.dropna())
'''
0 a
1 b
3 c
'''
#并没有在原来的Series上进行直接删除
print(s)
'''
0 a
1 b
2 NaN
3 c
4 None
'''
#通过设置inplace参数为True,在原Series上进行删除,不会返回Series
print(s.dropna(inplace=True))
#None
print(s)
'''
0 a
1 b
3 c
'''
b、DataFrame的缺失值过滤
b、DataFrame的缺失值过滤
相比Series,DataFrame删除缺失值的操作更为复杂。根据需求,你可能希望删除包含任何缺失值的行或列,也可能仅在整行或整列全为缺失值时才执行删除。Pandas针对这两种情况提供了相应的处理方法。
1、删除含有缺失值的行和列
1、删除含有缺失值的行和列
a = [[1, np.nan, 2],[9,None,np.nan],[3, 4, None],[5,6,7]]
data = DataFrame(a)
print(data)
'''
0 1 2
0 1 NaN 2.0
1 9 NaN NaN
2 3 4.0 NaN
3 5 6.0 7.0
'''
#使用dropna方法删除含有缺失值的行,默认是行
print(data.dropna())
'''
0 1 2
3 5 6.0 7.0
'''
#删除含有缺失值的列
print(data.dropna(axis=1))
'''
0
0 1
1 9
2 3
3 5
'''
2、删除全为NaN的行和列
2、删除全为NaN的行和列
a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
data = DataFrame(a)
print(data)
'''
0 1 2
0 1.0 NaN 2.0
1 NaN NaN NaN
2 3.0 NaN NaN
3 5.0 NaN 7.0
'''
#当行全为NaN的时候,才删除,参数how默认是any,含有缺失值就删除
print(data.dropna(how="all"))
'''
0 1 2
0 1.0 NaN 2.0
2 3.0 NaN NaN
3 5.0 NaN 7.0
'''
#当列全为NaN的时候,才删除
print(data.dropna(how="all",axis=1))
'''
0 2
0 1.0 2.0
1 NaN NaN
2 3.0 NaN
3 5.0 7.0
'''
dropna方法的inplace参数设置与Series一致。
3、指定删除数据后显示部分数据观察
3、指定删除数据后显示部分数据观察
a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
data = DataFrame(a)
print(data)
'''
0 1 2
0 1.0 NaN 2.0
1 NaN NaN NaN
2 3.0 NaN NaN
3 5.0 NaN 7.0
'''
#当行全为NaN的时候,才删除,参数how默认是any,含有缺失值就删除
print(data.dropna(how="all"))
'''
0 1 2
0 1.0 NaN 2.0
2 3.0 NaN NaN
3 5.0 NaN 7.0
'''
#通过thresh参数来控制显示删除数据的条数,删除列的时候thresh参数无效
print(data.dropna(how="all",thresh=2))
'''
0 1 2
0 1.0 NaN 2.0
3 5.0 NaN 7.0
'''
三、填充缺失值
三、填充缺失值
数据具有宝贵价值,尤其在数据量有限时,保留数据对模型训练和数据分析更为有利,因此我们往往倾向于不删除数据。通常的做法是使用特定值填充缺失部分。下面介绍如何使用Pandas的fillna方法来填充缺失数据。
1、指定特殊值填充缺失值
1、指定特殊值填充缺失值
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
data = DataFrame(a)
print(data)
'''
0 1 2
0 1 2.0 2.0
1 3 NaN 6.0
2 3 7.0 NaN
3 5 NaN 7.0
'''
#用0填充所有的缺失数据
print(data.fillna(0))
'''
0 1 2
0 1 2.0 2.0
1 3 0.0 6.0
2 3 7.0 0.0
3 5 0.0 7.0
'''
2、不同列使用不同的填充值
2、不同列使用不同的填充值
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
data = DataFrame(a)
print(data)
'''
0 1 2
0 1 2.0 2.0
1 3 NaN 6.0
2 3 7.0 NaN
3 5 NaN 7.0
'''
print(data.fillna({1:1,2:2}))
'''
0 1 2
0 1 2.0 2.0
1 3 1.0 6.0
2 3 7.0 2.0
3 5 1.0 7.0
'''
3、前向填充和后向填充
3、前向填充和后向填充
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
data = DataFrame(a)
print(data)
'''
0 1 2
0 1 2.0 2.0
1 3 NaN 6.0
2 3 7.0 NaN
3 5 NaN 7.0
'''
#前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充
print(data.fillna(method="ffill"))
'''
0 1 2
0 1 2.0 2.0
1 3 2.0 6.0
2 3 7.0 6.0
3 5 7.0 7.0
'''
#后向填充,使用下一行的值,不存在的时候就不填充
print(data.fillna(method="bfill"))
'''
0 1 2
0 1 2.0 2.0
1 3 7.0 6.0
2 3 7.0 7.0
3 5 NaN 7.0
'''
4、使用列的平均值进行填充
4、使用列的平均值进行填充
a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
data = DataFrame(a)
print(data)
'''
0 1 2
0 1 2.0 2.0
1 3 NaN 6.0
2 3 7.0 NaN
3 5 NaN 7.0
'''
print(data.fillna(data.mean()))
'''
0 1 2
0 1 2.0 2.0
1 3 4.5 6.0
2 3 7.0 5.0
3 5 4.5 7.0
'''
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









