文章目录
一. 简介
1. 缺失数据简介
好多数据集都含缺失数据。缺失数据有多重表现形式
数据库中,缺失数据表示为NULL
在某些编程语言中用NA表示
缺失值也可能是空字符串(’’)或数值
在Pandas中使用NaN表示缺失值
2. NaN简介
Pandas中的NaN值来自NumPy库,NumPy中缺失值有几种表示形式:NaN,NAN,nan,他们都一样
缺失值和其它类型的数据不同,它毫无意义,NaN不等于0,也不等于空串,
① 查看NaN,NAN,nan
② 两个NaN也不相等
③ isnull/isna方法
Pandas提供了isnull/isna方法,用于测试某个值是否为缺失值
④ notnull/notna
Pandas的notnull/notna方法也可以用于判断某个值是否为缺失值
二. 加载缺失值
1. 来源
缺失值的来源有两个
原始数据包含缺失值
数据整理过程中产生缺失值
pd.read_csv('data/survey_visited.csv')
2. 加载数据,不包含默认缺失值
pd.read_csv('data/survey_visited.csv',keep_default_na=False)
3.加载数据,手动指定缺失值
pd.read_csv('data/survey_visited.csv',na_values={'dated':'1927-02-10','site':'DR-1'})
三.处理缺失值
1. 加载数据
train=pd.read_csv('data/titanic_train.csv')
test=pd.read_csv('data/titanic_test.csv')
train.shape
train.head()
2. 查看数据
查看是否获救数据
train['Survived'].value_counts()
检测数据集中每一列中缺失值的百分比
定义missing_values_table,计算每列缺失百分比查看训练集缺失情况
train_missing= missing_values_table(train) train_missing
查看测试集缺失情况
test_missing= missing_values_table(test) test_missing
训练集和测试集的缺失值比例基本相似
3. 缺失值可视化
使用Missingno来对缺失值进行可视化
安装pip install missingno
导入模块import missingno as msno条形图
import missingno as msno msno.bar(train)
条形图提供了数据集完整性的可视化图形。
我们可以看到“年龄”,“客舱号码”和“登船的港口”列包含值缺失
4. 查看缺失值之间相关性
数据缺失原因
通过计算缺失值间相关性判断缺失原因msno.heatmap(train)
5. 删除缺失值
删除缺失值
删除缺失值会损失信息,并不推荐删除,当缺失数据占比较低的时候,可以尝试使用删除缺失值按行删除:删除包含缺失值的记录
train_1 = train.copy() # 复制一份数据 train_1.dropna(subset=['Age'],how='any',inplace=True) train_1['Age'].isnull().sum() train_1.shape
(714, 12)
train_1.dropna(subset=['Age','Cabin'],how='any',inplace=True)
按列删除
当一列包含了很多缺失值的时候(比如超过80%),可以将该列删除,但最好不要删除数据train_1.drop(['Age'],axis = 1).head()
train_1.drop(['Age','Cabin'],axis = 1).head()
6. 填充缺失值
填充缺失值是指用一个估算的值来去替代缺失数
① 非时间序列数据
使用常量来替换(默认值)
train_constant= train.copy() train_constant.fillna(0,inplace=True) train_constant.isnull().sum()
train_constant[train_constant['Cabin']==0].shape
(687, 12)
使用统计量替换(缺失值所处列的平均值、中位数、众数)
train_mean = train.copy() train_mean['Age'].fillna(train_mean['Age'].mean(),inplace = True) train_mean.isnull().sum()
② 时间序列数据
- 我们同样可以使用pandas的fillna来处理这类情况
- 用时间序列中空值的上一个非空值填充
- 用时间序列中空值的下一个非空值填充
- 线性插值方法
加载时间序列数据,数据集为印度城市空气质量数据(2015-2020)
city_day = pd.read_csv('data/city_day.csv',parse_dates=['Date'],index_col='Date') city_day1=city_day.copy() city_day.head()
用之前封装的方法,查看数据缺失情况
city_day_missing= missing_values_table(city_day) city_day_missing
数据中有很多缺失值,比如Xylene(二甲苯)和 PM10 有超过50%的缺失值
查看包含缺失数据的部分city_day['Xylene'][50:64]
使用ffill 填充,用时间序列中空值的上一个非空值填充
NaN值的前一个非空值是0.81,可以看到所有的NaN都被填充为0.81city_day.fillna(method='ffill',inplace=True) city_day['Xylene'][50:65]
使用bfill填充,用时间序列中空值的下一个非空值填充
NaN值的后一个非空值是209,可以看到所有的NaN都被填充为209city_day.fillna(method='bfill',inplace=True) city_day['AQI'][20:30]
线性插值方法填充缺失值
时间序列数据,数据随着时间的变化可能会较大。
使用bfill和ffill进行插补并不是解决缺失值问题的最优方案。
线性插值法是一种插补缺失值技术,它假定数据点之间存在线性关系,
利用相邻数据点中的非缺失值来计算缺失数据点的值。city_day1.interpolate(limit_direction="both",inplace=True) city_day1['Xylene'][50:65]
其它填充缺失值的方法
除了上面介绍的填充缺失值的方法外,还可以使用机器学习算法预测来进行缺失值填充