Pandas-缺失数据处理

发布于:2025-02-11 ⋅ 阅读:(50) ⋅ 点赞:(0)

一. 简介

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.81

    city_day.fillna(method='ffill',inplace=True)
    city_day['Xylene'][50:65]
    

    在这里插入图片描述

    • 使用bfill填充,用时间序列中空值的下一个非空值填充
      NaN值的后一个非空值是209,可以看到所有的NaN都被填充为209

      city_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]
    

    在这里插入图片描述

  • 其它填充缺失值的方法
    除了上面介绍的填充缺失值的方法外,还可以使用机器学习算法预测来进行缺失值填充


网站公告

今日签到

点亮在社区的每一天
去签到