内容简介: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学数据科学
- 下一站:科学家
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。