内容简介:1. 缺失数据的表现对于一些数据,可能某些值是空的,是缺失的。pandas中可以有多种处理缺失数据的方式。在pandas中,缺失数据的表现是isnull返回一个布尔型的对象,这些布尔值表示哪些值是缺失值NaN,该对象返回的类型和原类型一样。
缺失数据的处理
1. 缺失数据的表现
对于一些数据,可能某些值是空的,是缺失的。pandas中可以有多种处理缺失数据的方式。在pandas中,缺失数据的表现是 NaN(Not a Number)
,可以使用 isnull()
函数检测出是否有数据缺失。
In [4]: data = pd.Series(['aaa','bbb',np.nan,'ddd']) In [5]: data Out[5]: 0 aaa 1 bbb 2 NaN 3 ddd dtype: object In [6]: data.isnull() Out[6]: 0 False 1 False 2 True 3 False dtype: bool
isnull返回一个布尔型的对象,这些布尔值表示哪些值是缺失值NaN,该对象返回的类型和原类型一样。
处理缺失数据的方式有多种,常见为删除缺失数据与填充缺失数据。
2. 丢弃缺失数据
pandas的dropna方法可以有效的删除掉缺失数据,对于Series来说,dropna方法返回一个仅含非空数据和索引值的Series:
In [7]: data Out[7]: 0 aaa 1 bbb 2 NaN 3 ddd dtype: object In [8]: data.dropna() Out[8]: 0 aaa 1 bbb 3 ddd dtype: object
对于DataFrame,dropna可以删除所有含有空值的行或列,也可以根据个人删除指定的行或列,dropna默认会删除所有含有NaN的行:
In [17]: df Out[17]: name age area 0 aa 18 北京 1 NaN 18 广州 2 cc 20 NaN In [18]: df.dropna() Out[18]: name age area 0 aa 18 北京
传入how='all',那么dropna只会删除一行全是缺失值的行:
In [19]: df.loc[3]=[np.nan,np.nan,np.nan] In [20]: df Out[20]: name age area 0 aa 18.0 北京 1 NaN 18.0 广州 2 cc 20.0 NaN 3 NaN NaN NaN In [21]: df.dropna(how='all') Out[21]: name age area 0 aa 18.0 北京 1 NaN 18.0 广州 2 cc 20.0 NaN
如果要删除有缺失值的一列,只需要传入axis=1:
In [25]: df['avg'] = [20,30,40,50] In [26]: df Out[26]: name age area avg 0 aa 18.0 北京 20 1 NaN 18.0 广州 30 2 cc 20.0 NaN 40 3 NaN NaN NaN 50 In [27]: df.dropna(axis=1) Out[27]: avg 0 20 1 30 2 40 3 50
同样, dropna(axis=1,how='all')
只会删除整列都是缺失值的那一列。
如果想留下部分含有缺失值的数据作为观察,或者说只想删除部分数据,那么就需要使用thresh参数了,保留至少有n个非NaN数据的行/列:
In [52]: df Out[52]: name age area avg 0 aa 18.0 北京 20 # 这一行4个值都不是NaN值,非NaN值为4 1 NaN 18.0 广州 30 # 有1个NaN值,非NaN值为3 2 cc 20.0 NaN 40 # 有1个NaN值,非NaN值为3 3 NaN NaN NaN 50 # 有3个NaN值,非NaN值为1 In [53]: df.dropna(thresh=4) # 选取非空值至少有4个的行 Out[53]: name age area avg 0 aa 18.0 北京 20 In [54]: df.dropna(thresh=2) Out[54]: name age area avg 0 aa 18.0 北京 20 1 NaN 18.0 广州 30 2 cc 20.0 NaN 40 In [55]: df.dropna(thresh=4,axis=1) # 选取非空值至少有4个的列 Out[55]: avg 0 20 1 30 2 40 3 50
3. 填充缺失数据
对于缺失数据不想丢弃而想填充新的数据, fillna()
方法也许是首要选择。通过一个常数调用fillna就会将缺失值替换为那个常数值:
In [62]: df Out[62]: name age area avg 0 aa 18.0 北京 20 1 NaN 18.0 广州 30 2 cc 20.0 NaN 40 3 NaN NaN NaN 50 In [64]: df.fillna(0) Out[64]: name age area avg 0 aa 18.0 北京 20 1 0 18.0 广州 30 2 cc 20.0 0 40 3 0 0.0 0 50
若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值:
In [61]: df.fillna({'name':'dd','age':22,'area':'深圳'}) Out[61]: name age area avg 0 aa 18.0 北京 20 1 dd 18.0 广州 30 2 cc 20.0 深圳 40 3 dd 22.0 深圳 50
fillna默认会返回新对象,但也可以对现有对象进行就地修改:
In [65]: df.fillna(0,inplace=True) In [66]: df Out[66]: name age area avg 0 aa 18.0 北京 20 1 0 18.0 广州 30 2 cc 20.0 0 40 3 0 0.0 0 50
数据去重
数据中也有可能出现多行数据重复的情况,DataFrame的duplicated方法返回一个布尔型的对象,表示各行是否是重复的行,它每次都会对比前面出现的行,如果出现与前面出现的行一样的行,那么这一行就是重复行:
In [68]: data Out[68]: k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4 6 two 4 # 这一行与前一行重复,由于这一行在第5行后,所以会被判断为重复行 In [69]: data.duplicated() Out[69]: 0 False 1 False 2 False 3 False 4 False 5 False 6 True dtype: bool
而 drop_duplicates方法
,它会返回一个DataFrame,重复的数组会标为False并且删除:
In [70]: data.drop_duplicates() Out[70]: k1 k2 0 one 1 1 two 1 2 one 2 3 two 3 4 one 3 5 two 4
上面两个方法默认会判断全部列,如果只想根据一列进行重复值判断,可以传入包含列索引的列表:
In [75]: data Out[75]: k1 k2 v1 0 one 1 0 1 two 1 1 2 one 2 2 3 two 3 3 4 one 3 4 5 two 4 5 6 two 4 6 In [76]: data.drop_duplicates(['k1']) Out[76]: k1 k2 v1 0 one 1 0 1 two 1 1
duplicated和drop_duplicates默认保留的是第一个出现的值组合。传入keep='last'则保留最后一个:
In [51]: data.drop_duplicates(['k1', 'k2'], keep='last') Out[51]: k1 k2 v1 0 one 1 0 1 two 1 1 2 one 2 2 3 two 3 3 4 one 3 4 6 two 4 6
数据替换
有的时候需求是将数据框的某个值替换掉,pandas提供了replace方法,注意它与字符串的replace方法不一样。
pandas的replace方法操作的对象是DataFrame的值。
In [83]: data Out[83]: age name 0 -20 小明 1 20 老王 2 23 苹果 In [84]: data.replace(-20,0) # 将-20替换为0 Out[84]: age name 0 0 小明 1 20 老王 2 23 苹果
如果要让替换值有不同的值,要传入一个列表
In [88]: data.replace(['小明','老王'],['猕猴桃','西瓜']) Out[88]: age name 0 -20 猕猴桃 1 20 西瓜 2 23 苹果
替换多个值:
In [90]: data.replace(['小明','老王'],'苹果') Out[90]: age name 0 -20 苹果 1 20 苹果 2 23 苹果
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 数据科学库pandas笔记2
- 如何成为数据科学家?数据科学业界大牛们倾囊相授
- 阿里科学家 | 蚂蚁AI首席科学家漆远: 用AI和爱, 让我们遇见更美好的未来
- 深睿医疗首席科学家俞益洲入选2019 IEEE Fellow、2018ACM杰出科学家
- Python学数据科学
- 下一站:科学家
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beautiful Code
Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99
In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!