数据科学库pandas笔记3

栏目: 数据库 · 发布时间: 5年前

内容简介: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   苹果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

链接

链接

[美] 巴拉巴西 / 徐彬 / 湖南科技出版社 / 2007-04-01 / 28.00

从鸡尾酒会到恐怖分子的巢穴,从远古的细菌到国际组织——所有这一切各自都是一种网络,都是一个令人惊讶的科学革新的一部分。21世纪初,有科学家发现,网络具有深层的秩序,依据简单而强有力的规则运行。这一领域的知识帮助我们了解时尚、病毒等的传播机制,了解生态系统的稳健性,以及经济体系的脆弱性——甚至是民主的未来。 一位致力于研究“链接和节点”的科学家将首次带领我们领略网络革新的内幕。在本书中,作者生......一起来看看 《链接》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具