
【千锋教育干货暴击】
如果你想更好的学习Python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!
↓ ↓ ↓
千锋教育Python教程_700集零基础Python入门到精通教程(保姆级新手教程)
千锋教育Python教程全套_python零基础入门到精通(学完可达到Python工程师水平)

只要和数据打交道,就不可能不面对一个令人头疼的问题-数据集中存在缺失值。缺失值处理,是数据预处理之数据清洗的重要内容之一。
本篇文章更加细致的讨论一下缺失值在Pandas中的判断和处理。
首先我们有三张表格:

在jupyter notebook中我们读取数据如下:

通过对比我们发现:
不加入空格时,序号列被读为float型,出生日期列被读为datetime64型,而加入了空格后,统一解读为object型。
不加入空格时,序号列和姓名列中的缺失值默认为NaN,而时间则为NaT,而加了空格后,缺失值统一为NaN。
当时间识别为datetime64类型时,其格式就是输入的格式,但其识别为字符串时,格式会统一加上时分秒。 缺失值:在DataFrame中读出数据显示为NaN或者NaT(缺失时间),在Series中为None或者NaN均可。
快速确认数据集中是不是存在缺失值。有两个函数 isnull, isna,这两个函数可以帮助我们快速定位数据集中每个元素是否为缺失值。
isna(isnull)的使用:
先说一下被问过很多次的问题,就是isna和isnull的区别?我们看一下如下代码:

说明其实这两个是一个函数,isnull就是isna。ok明白了吗?
下面我们看如何使用isna,以上面的表格数据为例:
查看所有列的缺失值情况
import pandas as pd
ts2 = pd.read_excel('table1.xlsx',sheet_name='Sheet2',encoding='gbk') # 注意编码设置根据情况设置也可以省略
pd.isna(ts2) # 或者ts2.isna() 结果:

查看某一列的缺失值情况
pd.isna(ts2['出生日期']) # ts2['出生日期'].isna()

找出出生日期有缺失值的行,当然也可以是其他的列名
ts2[ts2['出生日期'].isna()]

对缺失值的处理主要有两种方式:
填充
删除 缺失值填充
缺失值的填充我们使用:fillna。
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, kwargs)
函数作用:填充缺失值 value: 需要用什么值去填充缺失值
axis: 确定填充维度,从行开始或是从列开始
method:ffill:用缺失值前面的一个值代替缺失值,如果axis =1,那么就是横向的前面的值替换后面的缺失值,如果axis=0,那么则是上面的值替换下面的缺失值。backfill/bfill,缺失值后面的一个值代替前面的缺失值。注意这个参数不能与value同时出现
limit:确定填充的个数,如果limit=2,则只填充两个缺失值。
# 仍然是上面的数据:Sheet1
ts1 = pd.read_excel('table1.xlsx',sheet_name='Sheet1')
ts1.fillna(axis=0,method='bfill')
ts1.fillna(axis=0,method='ffill')
ts1.fillna(axis=1,method='bfill') # 当前axis=1没有太大意义,还破坏了结构

也可以使用fillna(固定value)填充所有或者填充某列内容

如果加上limit参数就会对每列出现的替换值有次数限制。
缺失值删除
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
函数作用:删除含有空值的行或列 axis:维度,axis=0表示index行,axis=1表示columns列,默认为0
how: "all"表示这一行或列中的元素全部缺失(为NaN)才删除这一行或列,"any"表示这一行或列中只要有元素缺失,就删除这一行或列
thresh: 一行或一列中至少出现了thresh个才删除。
subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)
inplace:刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。


注意一下inplace参数,inplace默认为False是返回新的数据集,而如果inplace为True则表示在原数据集上操作。


需要资料也可以关注微信公众号:Python专栏,事不宜迟,一起进步吧!
