人工智能之Numpy与Pandas培训文档
创建时间:2018-09-09  访问量:3293  4  0

人工智能之Numpy与Pandas培训文档

通过一维数组创建Series

首先引入需要用到的数据包:

>>> import numpy as np
>>> import pandas as pd
>>> from pandas import Series, DataFrame

下面我们通过一个ndarray创建一个Series:

>>> arr = np.array([3,6,1,8,9,12]) # 通过numpy创建一个ndarray
>>> series01 = Series(arr) # 将ndarray创建Series对象
>>> series01 # 输出索引与数组
0     3
1     6
2     1
3     8
4     9
5    12
dtype: int32

由以上代码可知,如果没有指定索引,索引黙认自动生成一个整型序列,创建的Series数据类型dtype是int32,这是Series自动选择一个合适的类型。

我们来看一下Series的索引列:

>>> series01.index
RangeIndex(start=0, stop=6, step=1)

上面的索引是一个RangIndex对象,从0开始,到6(不包括6),步长是1。从输出中也可看出。

再来看一下Series的数据值:

>>> series01.values
array([ 3,  6,  1,  8,  9, 12])

Series的数据值就是一个Numpy的数组。

也可以通过dtype查看数据类型。

>>> series01.dtype
dtype('int32')
>>> series01.astype(float) # 可以改变数据类型
0     3.0
1     6.0
2     1.0
3     8.0
4     9.0
5    12.0
dtype: float64

看一下,操作是不是与numpy一样的,其实pandas主要提供了Series与DataFrame这两种数据结构,大部分操作都与Numpy一样。

上面示例中,Series的索引是自动生成的这样一个自动增长的整数类型的值,下面我们手动指定字符串类型的索引。

>>> series02 = Series([34.5,56.78,45.67]) # 通过Python列表创建一个Series
>>> series02
0    34.50
1    56.78
2    45.67
dtype: float64
>>> series02.index = ['product1','product2','product3'] # 通过赋值方式重新指定Series索引
>>> series02
product1    34.50
product2    56.78
product3    45.67
dtype: float64

当然也可以在创建Series的时候指定:

>>> series02 = Series(data=[34.5,56.78,45.67],index=['product1','product2','product3'],dtype=float)
>>> series02
product1    34.50
product2    56.78
product3    45.67
dtype: float64
>>> series03 = Series([98,56,88,45],index=[u'语文',u'数学',u'英语',u'体育'])
>>> series03
语文    98
数学    56
英语    88
体育    45
dtype: int64
>>> series03.index
Index([u'语文', u'数学', u'英语', u'体育'], dtype='object')
>>> series03.values
array([98, 56, 88, 45], dtype=int64)

 

 

通过字典方式创建Series

Series可以被看作是一个定长的有序的字典,是索引值到数据值的映射,因此可以直接通过字典来创建Series。

>>> import numpy as np
>>> import pandas as pd
>>> from pandas import Series, DataFrame
>>> a_dict = {'20071001':6798.98,'20071002':34556.89,'20071003':3748758.88}
>>> series04 = Series(a_dict)
>>> series04.index
Index([u'2001002', u'20071001', u'20071003'], dtype='object')
>>> series04.values
array([  34556.89,    6798.98, 3748758.88])
>>> series04.dtype
dtype('float64')

上面代码通过字典a_dict创建Series,字典的键组成Series的索引,字典的值组成Series的值。

 

Series应用NumPy数组运算

1、通过Series的索引取值

>>> series04['20071001'] # 通过自定义索引获取数据
'6798.98'
>>> series04[0] # 通过黙认索引获取数据,是不是惊讶了?
'34556.89'

2、Numpy的数组运算在Series中保留使用,并且Series在进行数组运算时,索引与值之间的映射关系不会改变。

>>> series04
20071001       6798.98
20071002      34556.89
20071003    3748758.88
dtype: float64
>>> series04[series04>10000] # 运用numpy中的布尔索引,满足元素大于10000的数据
20071002      34556.89
20071003    3748758.88
dtype: float64
>>> series04 / 100 # 数组与标量的操作是元素级的
20071001       67.9898
20071002      345.5689
20071003    37487.5888
dtype: float64
>>> series05 = Series([1,2,3,4]) 
>>> np.exp(series05) # 可以直接通过numpy的函数来进行操作,这个np.exp函数求的是e^x,e的x次方
0     2.718282
1     7.389056
2    20.085537
3    54.598150
dtype: float64

 

Series缺失值检测

示例:

>>> scores = Series({"Tom":89,"John":88,"Merry":96,"Max":65})
>>> scores
John     88
Max      65
Merry    96
Tom      89
dtype: int64
>>> new_index = ["Tom","Max","Joe","John","Merry"] # 索引列比数据列多一个Joe
>>> scores = Series(scores,index=new_index)
>>> scores # Joe索引之前是没有数据的,所以此处为NaN,这个NaN是无效值,或空值,即np.nan对象
Tom      89.0
Max      65.0
Joe       NaN
John     88.0
Merry    96.0
dtype: float64

1、pandas中的isnull和notnull函数可用于Series缺失值检测。

2、isnull和notnull函数都返回一个布尔类型的Series。

>>> pd.isnull(scores) # 将缺失值/空值标记为True,也可以使用Series中的方法scores.isnull()
Tom      False
Max      False
Joe       True
John     False
Merry    False
dtype: bool
>>> pd.notnull(scores) # 将非缺失值/非空值标记为True,可以侃用Series中的方法scores.notnull()
Tom       True
Max       True
Joe      False
John      True
Merry     True
dtype: bool

我们将上面的一个NAN空值修补设置成0值,这样数据可以参与运算了。

>>> scores[scores.isnull()] = 0
>>> scores
Tom      89.0
Max      65.0
Joe       0.0
John     88.0
Merry    96.0
dtype: float64

当然,如果你非要用for循环来过滤空值,我也不拦你,哪个更方便,谁用谁知道!

 

Series自动对齐

Series这个数据结构是包括索引和索引对应的值,如果两个Series进行运算时,会将索引相同的元素值进行对应的计算,例如:

>>> product_num = Series([23,45,67,89],index=['p3','p1','p2','p5'])
>>> product_num
p3    23
p1    45
p2    67
p5    89
dtype: int64
>>> product_price_table = Series([9.98,2.34,4.56,5.67,8.78],index=['p1','p2','p3','p4','p5'])
>>> product_price_table
p1    9.98
p2    2.34
p3    4.56
p4    5.67
p5    8.78
dtype: float64
>>> product_sum = product_num * product_price_table
>>> product_sum # 两个Series中对应索引值处进行运算,product_price_table中有一个索引p4,product_num中没有也就是相当于NAN,所以运算结果中相当于5.67 * NAN,任何数据NAN相乘都是NAN
p1    449.10
p2    156.78
p3    104.88
p4       NaN
p5    781.42
dtype: float64

上面的代码中还有一点要说明一下,就是product_sum这个Series中索引其实是按索引进行排序过的,因为product_sum索引是字符串,因此就按字符串进行排序,并不是输出数据顺序与product_price_table中的索引顺序一致,如果将product_price_table改成product_price_table = Series([9.98,2.34,4.56,5.67,8.78],index=['p2','p1','p3','p4','p5']),得到的结果product_sum还是这样排序的,p1在最前面,依此类推。

Series运算的自动对齐就是将索引相同的数据相互对应再进行计算,也就两边索引自动对齐运算。

 

Series及其索引的name属性

Series对象本身及其索引都有name属性,可以设置。

>>> product_num
p3    23
p1    45
p2    67
p5    89
dtype: int64
>>> product_num.name = 'ProductNums'
>>> product_num
p3    23
p1    45
p2    67
p5    89
Name: ProductNums, dtype: int64
>>> product_num.index.name = 'ProductType'
>>> product_num # 会显示索引名称
ProductType
p3    23
p1    45
p2    67
p5    89
Name: ProductNums, dtype: int64

 

Series结构的索引对象
  • 不管是Series对象还是DataFrame对象,都有索引对象。
  • 索引对象负责管理轴标签和其它元数据(比如轴名称)。
  • 通过索引可以从Series、DataFrame中取值或赋值。
  • Series与DataFrame自动化对齐功能就是通过索引实现的。

1、通过索引从Series中取值

>>> series01 = Series([34.56,23.34,45.66,98.08],index=['2001','2002','2003','2004'])
>>> series01
2001    34.56
2002    23.34
2003    45.66
2004    98.08
dtype: float64
>>> series01['2003'] # 取出索引为'2003'的值
'45.66'
>>> series01['2002':'2004'] # 切片,注意包括右边界,这一点与Python其它切片不同
2002    23.34
2003    45.66
2004    98.08
dtype: float64
>>> series01['2002':] # 取出索引从'2002'到最后的元素值
2002    23.34
2003    45.66
2004    98.08
dtype: float64
>>> series01[:'2003'] # 取出从开始到索引为'2003'处的值,包括'2003'
2001    34.56
2002    23.34
2003    45.66
dtype: float64

2、通过索引设置Series对应位置的值

>>> series01['2001'] = 35.65 # 将索引为'2001'处的值设为35.65
>>> series01
2001    35.65
2002    23.34
2003    45.66
2004    98.08
dtype: float64
>>> series01[:'2002'] = [23.45,56.78] # 将索引为'2001'、'2002'位置处的值设为23.45和56.78
>>> series01
2001    23.45
2002    56.78
2003    45.66
2004    98.08
dtype: float64

上面的代码可以通过切片设置值,是因为切片是视图,共享底层数据。