数据清洗 Chapter07 | 简单的数据缺失处理方法

举报
不温卜火 发表于 2021/01/07 17:19:09 2021/01/07
【摘要】   大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客...

  大家好,我是不温卜火,是一名计算机学院大数据专业大二的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只有csdn这一个平台,博客主页:https://buwenbuhuo.blog.csdn.net/

这篇文章讲述的是简单的数据缺失处理方法。希望这篇数据清洗的文章对您有所帮助!如果您有想学习的知识或建议,可以给作者留言~


2

一、删除法

把数据看作是一个NxD的二维矩阵,N代表数据记录的数量,D代表属性的数量
1
如果缺失值数量较少,样本数据足够大,删除缺失数据是最方便的处理方法

  • 1、导入数据集Airbnb
import pandas as pd
import numpy as np
data = pd.read_csv('./input/calendar.csv', header=0, names=['listing_id','date','available','price'])

data.tail(15)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2

  • 2、按列删除
list_del_data = data.drop('price',axis=1, inplace=False)
list_del_data.tail(15)

  
 
  • 1
  • 2

3

  • 3、按行删除

根据专业知识,price是重点关注的属性,不应该被删除
把所有含缺失值的记录删除,没这样做保留所有的属性,但样本数量会减少
在Airbnb数据集中,price属性含有缺失值,删除含有缺失值的数据记录

pair_del_data = data.dropna(axis=0, inplace=False)
pair_del_data.tail(15)

  
 
  • 1
  • 2

4
数据删除总结:

  1. 在含缺失值的数据量占比非常小(<=5%)的情况下有效
  2. 以减少数据来换取信息的完整,都是大量隐藏在被删除数据中的信息
  3. 在缺失数据占比较大,服从非随机分布时,可能导致数据偏离,得出错误的结论
  4. 在一些实际场景下,数据的采集成本高且缺失值无法避免,删除方法可能会造成大量的资源浪费

二、均值填补

含有缺失值的数据没有携带完整的信息,但简单的删除会导致已有信息的丢失
保留现在的数据,并对缺失值进行填补,成为合适的选择
通常来说,可使用均值、中位数和众数对缺失值进行填补

1、使用Numpy库随机生成一个4行3列,含有缺失值的数据矩阵gen_data

import pandas as pd
import numpy as np
import random
np.random.seed(111)
gen_data=pd.DataFrame(np.random.randn(4, 3),index=[1,2,3,4],columns=['feature1','feature2','feature3'])
gen_data.loc[3,:]=np.nan # 强制把第三行设置成缺失值
gen_data

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

5

2、根据属性的不同类型,把含缺失值的属性进行缺失值填补

数值型:使用缺失值所在列的其他数据记录取值的均值、中位数进行填补
非数值型:使用同列其他数据记录取值次数最高的数值(众数)进行填补

  • 1、均值填补一般用于数值型数据

使用fillna()函数填补缺失值

gen_data.mean()

  
 
  • 1

6

  • 填补平均值
gen_data.fillna(gen_data.mean())   # 填补平均值

  
 
  • 1

7

  • 填补中位数
gen_data.fillna(gen_data.median())

  
 
  • 1

8

三、众数填补

众数填补一般用于非数值型数据
在此以青少年市场细分数据集为例,gender属性存在缺失值

  • 1、查看缺失值
import pandas as pd
teenager_df = pd.read_csv('./input/teenager.csv', nrows = 25)
teenager_df['gender'].value_counts(dropna=False)
teenager_df['gender']

  
 
  • 1
  • 2
  • 3
  • 4

9

  • 2、mode()函数求众数
teenager_df['gender'].mode()

  
 
  • 1

10

  • 3、inplace=True 在原有的基础上进行填充
teenager_df['gender'].fillna(teenager_df['gender'].mode()[0], inplace=True)
teenager_df['gender']

  
 
  • 1
  • 2

11

四、插值填补

利用函数f(x)在某个区间的特定值,计算出特定的函数
在区间内的其他点上使用该函数的值作为f(x)的近似值
使用插值法的思路,我们可以用来处理数据缺失,计算缺失值的估计值

1、常见的插值填补——拉格朗日插值填补

给定函数f(x)的n+1个互不相同的点Xi,对应的函数值为Yi
12
使用Scipy库的interpolate模块实现拉格朗日插值
步骤如下:
1、确定非缺失值的索引
2、找出含有缺失值列的其他值
3、调用lagrange函数得出拉格朗日插值多项式的系数
4、输入缺失值所在索引,返回对应的插值

  • 1、使用拉格朗日差值插补缺失值
from scipy.interpolate import lagrange
none_missing_data = gen_data[gen_data['feature1'].isnull() == False]
x1 = list(none_missing_data.index.values)
y1 = none_missing_data['feature1'].values
lagrange(x1,y1)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

多项式系数为
13

对第三行的缺失值进行插值
14

2、线性插值填补

当n = 1 时,拉格朗日插值退化为线性插值法

线性插值法也称为两点插值法
15

使用Pandas库的interpolate函数实现线性插值
参数使用默认值,相当于对缺失值所在位置的前后值求均值,进行填补

  • interpolate()函数

根据数据记录的index进行插值
修改gen_data的index
添加interpolate函数的参数method=‘values’

gen_data.index = [1,2,3,4]
gen_data.interpolate(method='values')

  
 
  • 1
  • 2

16

五、特殊值填补

把缺失值,空值等当作特殊取值来处理,区别任何其他的属性取值
将所有的缺失位置用None,unknown等来填充
但是这种方法可能会导致严重的数据偏离,无法准确表达原始数据的含义

  • 表示:
  • 1、在Pandas库中,np.nan作为缺失值的一种表示方式
    含义是Not a Number ,用来表明一个缺失的浮点型数值
  • 2、还可以使用Python语言中的None这个单例对象来表示缺失值
    None是一个Python对象,Pandas和Numpy库的数组不能随意使用
    None只能在类型为object的数据结构中出现,来表示缺失值

使用Numpy库的array函数创建含有None对象的一维ndarray数组none_array

  • 查看none_array的属性dtype为object
none_array = np.array([5,9,15,None, 20,21])
print(none_array.dtype)

  
 
  • 1
  • 2

17

  • 在object数组上无法执行sum,max等聚合操作
np.sum(none_array)

  
 
  • 1

18

六、哑变量发

如果离散型变量存在缺失值,可以将缺失值作为一个单独的取值进行处理
在青少年市场细分数据集中
将"性别"变量的缺失值作为一个特殊的取值"unknown",表示性别未知
认为"性别"变量包含“F”、“M”和“unknown”三个不同取值

import pandas as pd
import numpy as np

teenager_sns = pd.read_csv('./input/teenager_sns.csv')

print(teenager_sns['gender'].value_counts())

teenager_sns['gender'] = teenager_sns['gender'].replace(np.NaN, 'unknown')

print("")
print("哑变量方法处理后:\n")
print(teenager_sns['gender'].value_counts())

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

19

  本次的分享就到这里了,


11

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

13
12

文章来源: buwenbuhuo.blog.csdn.net,作者:不温卜火,版权归原作者所有,如需转载,请联系作者。

原文链接:buwenbuhuo.blog.csdn.net/article/details/105444730

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。