目录
一:了解NaN:
1: NaN啥也不是:
- 注意使用一定要导包:from numpy import NaN,nan,NAN
二:缺失值加载统计:
1:加载数据,不包含缺失值:
2:缺失值的统计:
案例: 加载泰坦尼克号上的数据,并且统计缺失值。
1:加载测试数据和真实数据:
2:统计缺失值:
# 检测数据集中每一列缺失的的百分比:
def missing_values_table(df):
# 根据列统计缺失值
mis_val = df.isnull().sum()
# 计算缺失值比例
mis_val_percent = 100 * df.isnull().sum()/len(df)
# 将缺失值和缺失比例拼接成dataframe,根据列拼接
mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)
# 给列重新命名:
mis_val_table_ren_columns = mis_val_table.rename( columns = {0 : '缺失值', 1 : '占比(%)'})
# 按照缺失值降序排列,并且把缺失值为0的数据排除
# 思路: 取出占比这一列不为0的三条数据,根据占比排序,round(1)表示保留一位有效数字
mis_val_table_ren_columns = mis_val_table_ren_columns[ mis_val_table_ren_columns.iloc[:,1] != 0].sort_values( '占比(%)', ascending=False).round(1)
return mis_val_table_ren_columns
3:使用Missingno 库对缺失值进行可视化
1: 安装Missingno:
2: 使用条形图显示缺失值:
import missingno as msno
msno.bar(train)
3: 缺失值分布图:
msno.matrix(train)
4:取出100条数据查看:(部分数据查看缺失值)
5: 查看缺失值之间是否具有相关性:
三:缺失值的处理:
1: 删除缺失值:
删除缺失值会损失数据,一般不推荐删除数据,当缺失值占比比较低时,可以尝试删除缺失值数据。
1.1: 按行删除:
train_1.dropna(subset=[‘Age’],how=‘any’,inplace=True)
train_1[‘Age’].isnull().sum()
注意删除的是整行数据,subset指定了要删除的字段, how=‘any’,说明Age含有空值的所有行都删除。 inplace指的是不生成新的对象,在原有的tarin_1这个对象上进行修改。
1.2: 按列删除:
按列删除:当一列包含了很多缺失值的时候(比如超过80%),可以将该列删除,但最好不要删除数据。
train_1.drop([‘Age’], axis = 1).head()
2: 填充缺失值:
2.1:默认值填充:
2.2: 统计值填充:
2.3:时间序列数据用前后值填充,线性插值填充。
1: 加载数据:
2: 使用上一个值进行填充:
city_day.fillna(method=‘ffill’,inplace=True)
3: 使用下一个值进行填充:
city_day.fillna(method=‘bfill’,inplace=True)
4: 线性差值方法填充缺失值:
时间序列数据,数据随着时间的变化可能会较大。 因此,使用bfill和ffill进行插补并不是解决缺失值问题的最优方案。
线性插值法是一种插补缺失值技术,它假定数据点之间存在线性关系,并利用相邻数据点中的非缺失值来计算缺失数据点的值。