只要和数据打交道,就不可能不面对一个令人头疼的问题-数据集中存在空值。空值处理,是数据预处理之数据清洗的重要内容之一。本篇文章更加细致的讨论一下空值在Pandas中的判断和处理。
#### pandas对空值的表现
首先我们有三张表格:
在jupyter notebook中我们读取数据如下:
通过对比我们发现:
> 1. 不加入空格时,序号列被读为float型,出生日期列被读为datetime64型,而加入了空格后,统一解读为object型。
>
> 2. 不加入空格时,序号列和姓名列中的缺失值默认为NaN,而时间则为NaT,而加了空格后,缺失值统一为NaN。
> 3. 当时间识别为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()]
```
#### 缺失值处理
对缺失值的处理主要有两种方式:
> 1. 填充
>
> 2. 删除
##### 缺失值填充
缺失值的填充我们使用: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 培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听