前言
Hello,屏幕前的小伙伴们大家好呀,一年又一年,一天又一天,转瞬之间梦幻般的 2020 年,也即将要过去了,小编先在这提前祝大家:元旦快楽。今天呢给大家分享在用 pandas 做数据分析时,遇到缺失值的几种处理方法。推荐好课:Python 自动化办公、Python3进阶:数据分析及可视。
当我们在处理数据时,遇到数值缺失的问题时,pandas 在这方面提供了很全面的方法,主要包括:
- isnull()——找出缺失值;
- notnull()——找出非缺失值;
- dropna()——剔除缺失值;
- fillna()——填充缺失值。具体使用方法请往下看。
一、isnull()
isnull() 用来找出缺失值的位置,返回一个布尔类型的掩码标记缺失值,下面是案例:
import pandas as pd
import numpy as np
data = pd.DataFrame({'name':['W3CSCHOOL',np.nan,'JAVA','PYTHON'],'age':[18,np.nan,99,None]})
data
执行以上代码得到数据如下:
name age
0 W3CSCHOOL 18.0
1 NaN NaN
2 JAVA 99.0
3 PYTHON NaN
这里我们可以看到不管我们创建DataFrame时控制用的是np.nan还是None,创建后都会变成NaN。
name age
0 False False
1 True True
2 False False
3 False True
二、notnull()
notnull()与isnull()正好相反,是找出非空值并用布尔值进行标记,下面是例子:
data.notnull()
name age
0 True True
1 False False
2 True True
3 True False
三、dropna()
dropna()就是字面意思,丢掉缺失值。
DataFrame.dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)
参数:
- axis:默认为 0,表示删除行还是列,也可以用“index”和“columns”表示;
- how:{‘any’, ‘all’}, 默认为 ‘any’;any 表示只要该行(列)出现空值就删除整行(列),all 表示整行(列)都出现空值才会删除整行(列);
- thresh:表示删除非空值小于 thresh 个数时删除;
- subset:列表类型,表示哪些列里有空值才删除行或列;
- inplace:与其他函数的 inplace 一样,表示是否覆盖原 DataFrame。
下面是例子:
data.dropna(axis=1,thresh=3)
name
0 W3CSCHOOL
1 NaN
2 JAVA
3 PYTHON
data.dropna(axis=0,how='all')
name age
0 W3CSCHOOL 18.0
2 JAVA 21.0
3 PYTHON NaN
data.dropna(subset = ['name'])
name age
0 W3CSCHOOL 18.0
2 JAVA 21.0
3 PYTHON NaN
四、fillna()
fillna()的作用是填充缺失值
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
参数:
- value:设置用于填充 DataFrame 的值
- method:默认为 None;设置填充 DataFrame 的方法有:‘backfill’, ‘bfill’, - ‘pad’, ‘ffill’四种,其中‘backfill’和 ‘bfill’是用前面的值填充空缺值,‘pad’和 ‘ffill’是用后面的值填充空缺值
- axis:填充缺失值所沿的轴,与上文的 axis 设置方法一样
- inplace:是否替换原 DataFrame,与上文的设置方法一样
- limit:设置被替换值的数量限制
- downcast:表示向下兼容转换类型,不常用
下面是例子:
data.fillna(0)
name age
0 W3CSCHOOL 18.0
1 0 0.0
2 JAVA 21.0
3 PYTHON 0.0
data.fillna(method='ffill')
name age
0 W3CSCHOOL 18.0
1 W3CSCHOOL 18.0
2 JAVA 21.0
3 PYTHON 21.0