在数据分析和科学计算领域,NumPy占据了非常重要的地位。NumPy使得Python具备了操作多维数组的功能,而且效率较高。pandas是使用Python进行数据分析必不可少的一个包,它建立在NumPy库之上,为了灵活地操作数据而提供了很多专门的方法,十分方便。由于要做的东西里面需要对数据进行处理和分析,所以便使我开始了NumPy与Pandas的学习之旅。这里我只介绍我学习的一些内容,至于NumPy和Pandas的常用库详解,请参考https://www.cnblogs.com/prpl/p/5537417.html 和官方手册。
1、数组的创建
获取数组的方法可以分为直接获取和间接获取:
直接获取可利用NumPy专门提供的函数np.arange和np.linspace实现
In : narr=np.arange(0,10,1)
In : narr
out : arange([0,1,2,3,4,5,6,7,8,9])
注意这里的np.array的步长是可以取小数,Python自带的range里面是不允许的。
用np.linspace获取相同的结果
In : narr = np.linspace(0,1,10,endpoint=False)
In : narr
Out : array([0\.,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9])
这里0、1、10分别代表起始点、终点和要通过分割得到的数据个数。最后的endpoint表示是否包含终点,默认是TRUE,即包含。
间接获取可以通过Python的list、tuple等来获取数组,除此之外,还可以通过array本身构成新的array。
In:import NumPy as np
In:narr = np.array([1,2,3])
In:narr
out:array([1,2,3])
In:narr = np.array((1,2,3))
In:narr
Out:array([1,2,3])
In:narr=np.array([[1,2,3],[4,5,6]])
In:narr
Out:
array([[1,2,3]
[4,5,6]])
In:narr=np.array([(1,2,3),(4,5,6)])
In:narr
Out:
array([[1,2,3]
[4,5,6]])
In:narr=np.array(((1,2,3),(4,5,6)))
In:narr
Out:
array([[1,2,3]
[4,5,6])
In:narr1=np.array([1,2,3])
In:narr2=np.array([4,5,6])
In:narr=np.array([narr1,narr2])
In:narr
Out:
array([[1,2,3]
[4,5,6]])
此外NumPy还有一些内置建立特殊数的函数:
np.zeros((2,3))
np.ones((2,3))
np.eye(3)
2、数组属性
常用属性shape、dtype(显示数据类型和定义数组类型),通过print(np.sctypeDict)可以查看
np.ones((3,5)).shape #描述数组的形状
np.ones((3,5)).reshape #来改变数组的形状
3、数组的操作
In:na=np.arange(10)
In:na
Out:array([0,1,2,3,4,5,6,7,8,9])
In:na[0]
#[]内的内容为0,表示取出第一个元素,视为单个元素的索引
Out:0
In:na[[0,1,2,3,4]]
#[]内的内容为[0,1,2,3,4]表示取出第1,2,3,4,5个元素,并将结果一起返回(array形式),视为多个元素的索引。
Out:array([0,1,2,3,4])
In:na[1:10]
Out:array([1,2,3,4,5,6,7,8,9])
In:na[1:10:2]
Out:array([1,3,5,7,9])
pandas大致分为三种数据结构:一维的Series、二维的DataFrame,以及三维的Panel。目前我学习的主要是Series和DataFrame在数据的选择、过滤等操作。除此之外,Pandas还可以和seaborn和+atplotlib配合实现强大的可视化功能。
1、Series
Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index)。
1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会使用默认索引(从0到N-1)。
# 引入Series和DataFrame
In [16]: from pandas import Series,DataFrame
In [17]: import pandas as pd
In [18]: ser1 = Series([1,2,3,4])
In [19]: ser1
Out[19]:
0 1
1 2
2 3
3 4
dtype: int64
1.2 当要生成一个指定索引的Series 时候,可以这样:
# 给index指定一个list
In [23]: ser2 = Series(range(4),index = ["a","b","c","d"])
In [24]: ser2
Out[24]:
a 0
b 1
c 2
d 3
dtype: int64
1.3 也可以通过字典来创建Series对象
In [45]: sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
In [46]: ser3 = Series(sdata)
# 可以发现,用字典创建的Series是按index有序的
In [47]: ser3
Out[47]:
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
在用字典生成Series的时候,也可以指定索引,当索引中值对应的字典中的值不存在的时候,则此索引的值标记为Missing,NA,并且可以通过函数(pandas.isnull,pandas.notnull)来确定哪些索引对应的值是没有的。
In [48]: states = ['California', 'Ohio', 'Oregon', 'Texas']
In [49]: ser3 = Series(sdata,index = states)
In [50]: ser3
Out[50]:
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
# 判断哪些值为空
In [51]: pd.isnull(ser3)
Out[51]:
California True
Ohio False
Oregon False
Texas False
dtype: bool
In [52]: pd.notnull(ser3)
Out[52]:
California False
Ohio True
Oregon True
Texas True
dtype: bool
1.4 访问Series中的元素和索引:
# 访问索引为"a"的元素
In [25]: ser2["a"]
Out[25]: 0
# 访问索引为"a","c"的元素
In [26]: ser2[["a","c"]]
Out[26]:
a 0
c 2
dtype: int64
# 获取所有的值
In [27]: ser2.values
Out[27]: array([0, 1, 2, 3])
# 获取所有的索引
In [28]: ser2.index
Out[28]: Index([u'a', u'b', u'c', u'd'], dtype='object')
2. DataFrame 对象的构建
DataFrame 类型类似于数据库表结构的数据结构,其含有行索引和列索引,可以将DataFrame 想成是由相同索引的Series组成的Dict类型。在其底层是通过二维以及一维的数据块实现。
2.1 用包含等长的列表或者是NumPy数组的字典创建DataFrame对象
In [68]: import pandas as pd
In [69]: from pandas import Series,DataFrame
# 建立包含等长列表的字典类型
In [70]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],'year': [2000, 2001, 20
...: 02, 2001, 2002],'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
In [71]: data
Out[71]:
{'pop': [1.5, 1.7, 3.6, 2.4, 2.9],
'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002]}
# 建立DataFrame对象
In [72]: frame1 = DataFrame(data)
# 红色部分为自动生成的索引
In [73]: frame1
Out[73]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
在建立过程中可以指点列的顺序:
In [74]: frame1 = DataFrame(data,columns=['year', 'state', 'pop'])
In [75]: frame1
Out[75]:
year state pop
0 2000 Ohio 1.5
1 2001 Ohio 1.7
2 2002 Ohio 3.6
3 2001 Nevada 2.4
4 2002 Nevada 2.9
和Series一样,DataFrame也是可以指定索引内容:
In [76]: ind = ['one', 'two', 'three', 'four', 'five']
In [77]: frame1 = DataFrame(data,index = ind)
In [78]: frame1
Out[78]:
pop state year
one 1.5 Ohio 2000
two 1.7 Ohio 2001
three 3.6 Ohio 2002
four 2.4 Nevada 2001
five 2.9 Nevada 2002
2.2. 用由字典类型组成的嵌套字典类型来生成DataFrame对象
当由嵌套的字典类型生成DataFrame的时候,外部的字典索引会成为列名,内部的字典索引会成为行名。生成的DataFrame会根据行索引排序
In [84]: pop = {'Nevada': {2001: 2.4, 2002: 2.9},'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
In [85]: frame3 = DataFrame(pop)
In [86]: frame3
Out[86]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
除了使用默认的按照行索引排序之外,还可以指定行序列:
In [95]: frame3 = DataFrame(pop,[2002,2001,2000])
In [96]: frame3
Out[96]:
Nevada Ohio
2002 2.9 3.6
2001 2.4 1.7
2000 NaN 1.5