Pandas缺失值处理-判断和删除

共 6024字,需浏览 13分钟

 ·

2021-08-25 13:10

一、缺失值概述
缺失数据,在大部分数据分析中都很常见,Pandas在设计之时,就考虑了这种缺失值的情况并让这种缺失数据处理任务变得轻松,构造了非常强大而又全面的缺失值处理方法,默认情况下,大部分的计算函数都会自动忽略数据集中的缺失值,在很多算法中,还是需要自行处理缺失值。
缺失值处理流程无非4个方面:检测、填充、删除、替换
 
官方文档:https://pandas.pydata.org/pandas-docs/stable/reference/frame.html

函数列表:
DataFrame.backfill([axis, inplace, limit, …])
for DataFrame.fillna() with method='bfill'.
DataFrame.bfill([axis, inplace, limit, downcast])
for DataFrame.fillna() with method='bfill'.
DataFrame.dropna([axis, how, thresh, …])
Remove missing values.
DataFrame.ffill([axis, inplace, limit, downcast])
for DataFrame.fillna() with method='ffill'.
DataFrame.fillna([value, method, axis, …])
Fill NA/NaN values using the specified method.
DataFrame.interpolate([method, axis, limit, …])
Please note that only method='linear' is supported for DataFrame/Series with a MultiIndex.
DataFrame.isna()
Detect missing values.
DataFrame.isnull()
Detect missing values.
DataFrame.notna()
Detect existing (non-missing) values.
DataFrame.notnull()
Detect existing (non-missing) values.
DataFrame.pad([axis, inplace, limit, downcast])
for DataFrame.fillna() with method='ffill'.
DataFrame.replace([to_replace, value, …])
Replace values given in to_replace with value.
关于空值的处理,主要有是4个方法,判断、填充、删除、替换。
缺失值检测,isna或isnull,二者等价,用于判断一个series或dataframe各元素值是否为空的bool结果。需注意对空值的界定:即None或numpy.nan才算空值,而空字符串、空列表等则不属于空值;类似地,notna和notnull则用于判断是否非空
缺失值填充,fillna,按一定策略对空值进行填充,如常数填充、向前/向后填充等,也可通过inplace参数确定是否本地更改
缺失值删除,dropna,删除存在空值的整行或整列,可通过axis设置,也包括inplace参数
缺失值替换,replace,非常强大的功能,对series或dataframe中每个元素执行按条件替换操作,还可开启正则表达式功能。
 

二、缺失值判断

Pandas提供了缺失值的检测方法是 isna 和 isnull,该方法通过布尔值的形式反馈某个值是否为缺失值。这样就可以便于观测缺失值,以及后续进一步地通过编程的方法批量地处理缺失值。isnull还有一个镜像方法notnull,以应对不同的编程场景。
 

DataFrame.isna()

df = pd.DataFrame({'age': [5, 6, np.NaN],                   'born': [pd.NaT, pd.Timestamp('1939-05-27'),                            pd.Timestamp('1940-04-25')],                   'name': ['Alfred', 'Batman', ''],                   'toy': [None'Batmobile''Joker']})df   age       born    name        toy0  5.0        NaT  Alfred       None1  6.0 1939-05-27  Batman  Batmobile2  NaN 1940-04-25              Jokerdf.isna()     age   born   name    toy0  False   True  False   True1  False  False  False  False2   True  False  False  Falseser = pd.Series([5, 6, np.NaN])ser.isna()0    False1    False2     True# 但对于DataFrame我们更关心到底每列有多少缺失值 统计缺失值的个数df.isna().sum()age     1born    1name    0toy     1

 

DataFrame.isnull()

与函数isna()两者其实是一样的,isnull就是一个别名而已
df.isnull()     age   born   name    toy0  False   True  False   True1  False  False  False  False2   True  False  False  False#统计某一列的缺失值个数df['age'].isnull().sum()1
 

DataFrame.notna()

非空值得个数
df.notna() age born name toy0 True False True False1 True True True True2 False True True True
 

DataFrame.notnull()

df.notnull() age born name toy0 True False True False1 True True True True2 False True True True
 
可以通过info()函数也可以看到缺失值的信息
df.info()<class 'pandas.core.frame.DataFrame'>RangeIndex: 3 entries, 0 to 2Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 age 2 non-null float64 1 born 2 non-null datetime64[ns] 2 name 3 non-null object 3 toy 2 non-null object dtypes: datetime64[ns](1), float64(1), object(2)memory usage: 224.0+ bytes
 
 

三、缺失值删除

DataFrame.dropna

函数作用:
删除含有空值的行或列
 
函数用法:
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:axis中至少有thresh个非缺失值,否则删除。
subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)
inplace:刷选过缺失值得新数据是存为副本还是直接在原数据上进行修改。默认是False,即创建新的对象进行修改,原对象不变,和深复制和浅复制有些类似。

df = pd.DataFrame({"name": ['Alfred', 'Batman', 'Catwoman'], "toy": [np.nan, 'Batmobile', 'Bullwhip'], "born": [pd.NaT, pd.Timestamp("1940-04-25"),                            pd.NaT]})df name toy born0 Alfred NaN NaT1 Batman Batmobile 1940-04-252 Catwoman Bullwhip NaT
#删除包含缺失值的行df.dropna() name toy born1 Batman Batmobile 1940-04-25#删除包含缺失值的列,需要用到参数axis='columns'df.dropna(axis='columns') name0 Alfred1 Batman2 Catwoman
df.dropna(how='all') name toy born0 Alfred NaN NaT1 Batman Batmobile 1940-04-252 Catwoman Bullwhip NaT
df.dropna(thresh=2) name toy born1 Batman Batmobile 1940-04-252 Catwoman Bullwhip NaT
df.dropna(subset=['name', 'born']) name toy born1 Batman Batmobile 1940-04-25
df.dropna(inplace=True)df name toy born1  Batman  Batmobile 1940-04-25
···  END  ···
推荐阅读:
Pandas中的宝藏函数-map
Pandas中的宝藏函数-apply
Pandas中的宝藏函数-applymap
一文搞懂Pandas数据排序
一网打尽Pandas中的各种索引 iloc,loc,ix,iat,at,直接索引
Pandas数据可视化原来也这么厉害
Pandas向量化字符串操作
一、Number(数字)
全面掌握Python基础,这一篇就够了,建议收藏
Python基础之数字(Number)超级详解
Python随机模块22个函数详解
Python数学math模块55个函数详解
二、String(字符串)
Python字符串的45个方法详解
Pandas向量化字符串操作
三、List(列表)
超级详解系列-Python列表全面解析
Python轻量级循环-列表推导式
四、Tuple(元组)
Python的元组,没想象的那么简单
五、Set(集合)
全面理解Python集合,17个方法全解,看完就够了
六、Dictionary(字典)
Python字典详解-超级完整版
七、内置函数
Python初学者必须吃透这69个内置函数!
八、正则模块
Python正则表达式入门到入魔
笔记 | 史上最全的正则表达式
八、系统操作
Python之shutil模块11个常用函数详解
Python之OS模块39个常用函数详解
九、进阶模块
【万字长文详解】Python库collections,让你击败99%的Pythoner
高手如何在Python中使用collections模块
扫描关注本号↓
浏览 72
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报