1.处理缺失值方法
在pandas中,将缺失值称为NA,意思是not available(不可用)
pandas在处理缺失值时,我们先了解相关函数介绍。
NA处理方法:
函数名 | 描述 |
dropna | 根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许丢失的数据量来确定阈值 |
fillna | 用某些值填充缺少的数据或使用插值方法(如‘ffill’或'bfill') |
isnull | 返回表名哪些值是缺失值的布尔值 |
notnull | isnull的反函数 |
2.过滤缺失值
过滤缺失值方法有很多种,可以使用pandas.dropna过滤缺失值。
先看一个例子,后续以下面张三李四等人考试成绩为例说明,其中把缺失值(nan)当成缺考。
import pandas as pd
from numpy import nan
data = pd.DataFrame([['张三', 86, 74, 69, 70, 92],
['李四', 61, 85, 68, 89, 93],
['王五', 63, 91, 98, nan, 88],
['小明', 77, None, nan, 82, 82], # None也会被当作NA处理
['小王', nan, nan, nan, nan, nan]],
columns=['姓名', '语文', '数学', '历史', '英语', '地理'])
print(data)
"""
姓名 语文 数学 历史 英语 地理
0 张三 86.0 74.0 69.0 70.0 92.0
1 李四 61.0 85.0 68.0 89.0 93.0
2 王五 63.0 91.0 98.0 NaN 88.0
3 小明 77.0 NaN NaN 82.0 82.0
4 小王 NaN NaN NaN NaN NaN
"""
- 过滤缺失值
##### 过滤至少一个NA的行 #####
print(data.dropna())
"""
姓名 语文 数学 历史 英语 地理
0 张三 86.0 74.0 69.0 70.0 92.0
1 李四 61.0 85.0 68.0 89.0 93.0
"""
##### 指定哪些列过滤缺失值 #####
print(data.dropna(subset=['数学'])
"""
姓名 语文 数学 历史 英语 地理
0 张三 86.0 74.0 69.0 70.0 92.0
1 李四 61.0 85.0 68.0 89.0 93.0
2 王五 63.0 91.0 98.0 NaN 88.0
"""
3.探索缺失值
##### 查看空值 #####
print(data.isnull().sum())
"""
姓名 0
语文 1
数学 2
历史 2
英语 2
地理 1
dtype: int64
"""
##### 取出所有有空值的记录 #####
print(data[data.isnull().T.any()])
"""
姓名 语文 数学 历史 英语 地理
2 王五 63.0 91.0 98.0 NaN 88.0
3 小明 77.0 NaN NaN 82.0 82.0
4 小王 NaN NaN NaN NaN Na
"""
4.补全缺失值
你有时候可能有很多种方式补全缺失值,而不是过滤缺失值,这里我以均值补全缺失值为例讲解
##### 你可能最先想到有某个值(标量)补全,比如补全数字:60 #####
print(data.fillna(60))
"""
姓名 语文 数学 历史 英语 地理
0 张三 86.0 74.0 69.0 70.0 92.0
1 李四 61.0 85.0 68.0 89.0 93.0
2 王五 63.0 91.0 98.0 60.0 88.0
3 小明 77.0 60.0 60.0 82.0 82.0
4 小王 60.0 60.0 60.0 60.0 60.0
"""
##### 进一步以每一科成绩的平均值作为填充值 #####
mean_dict = data.mean().to_dict() # 拿到字典格式的每科成绩的均值
data.fillna(mean_dict, inplace=True) # 均值作为填充值补全缺失值
data = data.applymap(lambda x: '%.2f' % x if isinstance(x, (float, int)) else x) # 为了输出结果有意义,小数保留2位
print(data)
"""
姓名 语文 数学 历史 英语 地理
0 张三 86.00 74.00 69.00 70.00 92.00
1 李四 61.00 85.00 68.00 89.00 93.00
2 王五 63.00 91.00 98.00 80.33 88.00
3 小明 77.00 83.33 78.33 82.00 82.00
4 小王 71.75 83.33 78.33 80.33 88.75
"""
总结
在调用fillna补全缺失值,不仅可以传入常量值,可以传入设定不同的填充值的字典。