1. 简介
很多数据集都含缺失值,在数据库中,缺失值表示为NULL. 在某些编程语言中用NA表示,它也可能是 空字符串 或数值. 在pandas中缺失值=NAN.
2.缺失值判断
pandas中NaN来自NumPy库, NumPy中缺失值有三种表示形式: NaN,nan,NAN. 缺失值毫无意义.不等于0,也不是空字符串.
from numpy import NaN,NAN,nan
print(NaN == True) # False
print(NaN == False) # False
print(NaN ==0) # False
print(NaN == '') # False
print(NaN ==nan) # false
pandas 方法 : isnull / isna(判断为空) / notnull / notna(判断不为空) 测量某个值是否为缺失值
import pandas as pd
print(pd.isnull(NaN)) # True
print(pd.isna(nan)) # True
print(pd.isna(NAN)) # True
print(pd.notnull(22)) # True
print(pd.notna(nan)) # False
2. 加载缺失值
缺失值来源 : 原始数据包含缺失值 / 数据整理中产生缺失值
加载数据时可以通过 keep_default_na , na_values指定加载数据时候的缺失值
pd.read_csv('/export/data/survey_visited.csv') # 加载数据
pd.read_csv('/export/data/survey_visited.csv',keep_default_na = False)# 加载数据时 不加载缺失值,忽略
pd.read_csv('/export/data/survey_visited.csv',na_values=[""],keep_default_na = False) # 手动指定某些数据为: 缺失值
3. 处理缺失值
pd.read_csv('/export/data/survey_visited.csv') # 加载数据
pd.read_csv('/export/data/survey_visited.csv',keep_default_na = False)# 加载数据 不包括默认缺失值
pd.read_csv('/export/data/survey_visited.csv',na_values=["734",'844'],keep_default_na = False) # 加载数据手动指定缺失值
4. 缺失值可视化
import pandas as pd
train = pd.read_csv('/export/data/titanic.csv')
train.head()
train.shape
train.info()
train['survived'].value_counts()
可视化模块 pip install matplotlib -- 查看缺失值
# 可视化模块 查看缺失值
import missingno as msno
msno.bar(train) #柱状图
# 查看缺失值相关性
msno.heatmap(train) # 热点图
5. 删除缺失值
1.删除缺失值会导致损失信息,一般不推荐.
-
按行删除 dropna()
import pandas as pd # 加载数据 train = pd.read_csv('/export/data/titanic_train.csv') # dropna() 默认按行删除 只要那行有空值 . train.dropna() # 带参 axis : 0 / 'rows' 按行删 1 / 'columns'按列删 # how : any 该行/列有一个NAN 就删 all 该行/列全为NAN删 train.dropna(axis = 0 ,how = 'any) # 传入列名删除 # 删除时, 参考该列的值, 该列值 为空, 才删除该行 train.dropna(subset = ['age'])
-
按列删除时 , 不能传入列名
train.dropna(axis = 'columns',how = 'any') #只要该列有空值 就删除该列 train.dropna(axis = 'columns', how = 'all') # 该列全为空,才删
6. 缺失值处理--填充缺失值
6.1 非时间序列数据填充
train.isnull().sum() # 计算每列空值 true为1
train.fillna(0) # 用0 代替空值
# 细节: 非时间序列数据, 在填充时,可以采用:常量,平均值,中位数...
# 用平均年龄填充空值
train['age'].fillna(train['age'].mean())
6.2 时间序列数据 -- 填充缺失值
# parse_dates参数 把某列值 转成 日期类型
# index_col 把某列index_col设置为DataFrame的索引。
city_data = pd.read_csv('data/city_day.csv'), parse_dates = ['DATe'], index_col = 'DATe)
# 查看每列缺失值情况
city_data.isnull().sum()
fillna() 固定值填充
city_data['Xylene'][40:60].isnull().sum()
city_data['Xylene'][40:60].fillna(0)
city_data['Xylene'][40:60].fillna(0).isnull().sum()
fillna() 用缺失值上一个数据 填充 method = 'ffill'
city_data['Xylene'][40:60].fillna(method = 'ffill')
用缺失值下一个数据填充 'bfill'
city_data['Xylene'][40:60].fillna(method = 'ffill')
线性填充 ,让程序根据上一个非空和下一个非控股,推测线性数据填充空值
interpolate(limit_direction=)它有三个值: forward(前), backward(后), both(前后)
city_data['Xylene'][40:60].interpolate(limit_direction = 'both') # 参考前后值
city_data['Xylene'][40:60].interpolate(limit_direction = 'backward') # 参考前值
city_data['Xylene'][40:60].interpolate(limit_direction = 'forward') # 参考后
总结
删除缺失值 : 按行/按列
填充缺失值: 默认值 /统计值/填充 时间序列数据,用前/后值填充, 线性插值填充,算法填充