python数据处理之numpy和pandas(中)

来源:互联网 发布:合肥百度上网软件 编辑:程序博客网 时间:2024/06/05 20:23

接着进行上篇开始讲,上篇主要介绍了numpy的一些基本数据操作,接下来我们进行的是numpy的矩阵合并和分割,索引等一些高级的东西。

4.索引

首先我们先将代码奉上,然后一一解读:
import numpy as npa = np.arange(3,15)print(a)print(a[3])#索引b = np.arange(3,15).reshape(3,4)print(b)print(b[2])print(b[1][1])print(b[1,1])print(b[1,:])print(b[:,1])print(b[1,1:3])for row in b:    print(row)for col in b.T:    print(col)print(b.flatten())for item in b.flat:    print(item)
按照前面所讲的,我们先创建一个有序的矩阵,要想知道某个位置上的具体数据,就索引出来,print(a[3])直接在屏幕上打印出来这个矩阵中第四个元素是多少。接着顺序创建一个(3,4)的矩阵,这样b[2]索引到的就是矩阵第三行的所有值,为什么是第三行?因为程序员们没有第一百朵玫瑰,哈哈。如果索引这个矩阵中的摸个位置上的具体值,就要将行和列都输上,b[1][1]是代表第二行第二列的那个数值,b[1][1]和b[1,1]是一样的效果。b[1,:]和b[1]在本例中是一样的,而b[:,1]是索引的第二列的数据,b[1,1:3]索引的是第一行第一列的和第一行第二列的数据。用for循环遍历b就是上面的方面,要想遍历b的转置就用接下来的方法。b.flatten()是将本矩阵写成一个列表的形式,若将矩阵中的数值写成一列,就需要for循环写成for item in b.flat这种循环了。

5.矩阵合并


矩阵合并共四个内置函数,训练代码如下:
import numpy as npa = np.array([1,1,1])b = np.array([2,2,2])c = np.vstack((a,b))#上下合并d = np.hstack((a,b))#左右合并print(a.shape,b.shape)print(c.shape)  print(d)print(d.shape)print(a[np.newaxis,:])print(a[:,np.newaxis])A = a[:,np.newaxis]B = b[:,np.newaxis]e = np.vstack((A,B))f = np.hstack((A,B))print(e)print(f)C = np.concatenate((A,B,B,A),axis=1)print(C)
现在我们来分析这段函数,首先定义两个(1,3)的矩阵,进行上下合并即变成(2,3),使用的是np.vstack(a,b)函数,a为第一行在上边。而np.hstack()是左右合并函数。a[:,np.newaxis]是改变矩阵的方向,将行矩阵变成列矩阵,同样的方法将b矩阵也变成列矩阵,这样,使用np.vstack()函数合并的话就变成6行一列,而上下合并,就变成了(3,2)矩阵。最后介绍一下合并函数np.concatenate(),可以实现若干个函数同时合并,要选择行合并和列合并只需要改变axis的值就可以了。下面贴出来输出的结果:
(3,) (3,)(2, 3)[1 1 1 2 2 2](6,)[[1 1 1]][[1] [1] [1]][[1] [1] [1] [2] [2] [2]][[1 2] [1 2] [1 2]][[1 2 2 1] [1 2 2 1] [1 2 2 1]]

6.numpy分割


矩阵的分割和合并是相互呼应的,所以对比起来理解的话就会显得很容易记忆,不过这么多的函数,记是不能够全部记下来的,只能够在实际的应用中熟悉它们吧,现在,将本次的代码先贴上:
import numpy as npa = np.arange(12).reshape((3,4))print(a)print(np.split(a,2,axis=1))#1代表列<1>print(np.split(a,3,axis=0))#<2>print(np.array_split(a,3,axis=1))#<3>print(np.vsplit(a,3))#<4>print(np.hsplit(a,2))#<5>
下面我们来具体分析这五个函数,顾名思义,np.split函数肯定是用来分割矩阵的,那么,函数里面的参数设计可以具体去调节如何分割。首先,分割成几块就填数字几,axis取值决定行分割还是列分割,取0是行分割,取1是列分割,还有一点值得注意,这种直接分割是不能分割成不整除份的。也就是说,三行的矩阵你不能这样分成两份,可以分成3份。如果想进行不平均的分配,可以是用<3>中的np.array_split()函数,它的分割方法是尽量让第一份分割多占一些比重以便让后续平均。<4><5>是行分割和列分割的函数式,直接使用而不用对axis进行赋值。好了,分割跟合并是一样的,那么我们贴出来结果:
[[ 0  1  2  3] [ 4  5  6  7] [ 8  9 10 11]][array([[0, 1],       [4, 5],       [8, 9]]), array([[ 2,  3],       [ 6,  7],       [10, 11]])][array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])][array([[0, 1],       [4, 5],       [8, 9]]), array([[ 2],       [ 6],       [10]]), array([[ 3],       [ 7],       [11]])][array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])][array([[0, 1],       [4, 5],       [8, 9]]), array([[ 2,  3],       [ 6,  7],       [10, 11]])]In [ ]:​

7.numpy copy和deep copy

python的赋值语句很简单,主需要等号就能让左边的变量完全和右边相同,从而形成“命运共同体”,即无论二值谁改变则全部改变。这有好处,弊端也不小,基于这样的考虑,numpy中又提供了copy函数,这种函数只会源变量改变时不会传递到目标变量中的,代码如下:
import numpy as npa = np.arange(4)b = ac = bprint(a)b[0] = 1print(a)d = a.copy()print(d)c[3] = 0print(d)print(a)
很好理解,就不多做解释,直接将运行结果显示出来:
[0 1 2 3][1 1 2 3][1 1 2 3][1 1 2 3][1 1 2 0]

至此,numpy的学习要告一段落了,这7个部分讲了很多关于numpy库中函数的使用,现在去回想可能也记不住全部,不要担心,学过的东西忘了和没看过没学过是不一样的,就像有一句话说的那样:“我曾经读过的书现在不记得了,它并没有凭空消逝,而是变成了思想在我的头脑中,变成了血肉在我的身体里,变成了阅历在我前行的路上!”所学的东西用到实际上才会让人记忆深刻,接下来我们就要进入pandas的学习了。哈哈~~~大笑

pandas

pandas跟numpy相辅相成,但是各有侧重,如果numpy是列表的话,pandas就是字典。当然,这样比喻是不够合理的,在实际的使用过程中,对数据的处理使对两个包都使用的,所以在编程中是要全部支持到的。pandas通常简称pd,不要搞特立独行,虽然换成hp也行,但是你的代码想让别人读懂就应该大家遵守同一个规范才行,不是吗?pandas是在numpy的基础值上创建出来的,所以存在自由它的优势之处,下面我们来进行pandas的学习,中间也会穿插numpy。

1.Series&DataFrame

先将代码贴出来,然后我们进行分析:
import numpy as npimport pandas as pds = pd.Series([1,3,4,np.nan,44,1])print(s)dates = pd.date_range('20171009',periods=6)print(dates)df = pd.DataFrame(np.random.rand(6,4),index = dates,columns=['a','b','c','d'])print(df)df1 = pd.DataFrame(np.arange(12).reshape(3,4))print(df1)
pd.Series是字典的样式输出,即你赋予的值会在右边以列的形式打印出来,在左边会自动的生成编号。对于日期的表示可通过调节后面periods的值进行打印自己想要的日期序列,不过这步经常使用,只是展示一下如何用,包含着这种功能。DataFrame是一个表格型的数据结构,它包含一组有序的列,每列中是可以赋予不同的值得,这些值可以是整型,字符串甚至是布尔类型。它有行索引和列索引,比较全面,所以可以看做是Series组成的大字典。比如我们可以创建一组不定行不定列的标签,那么index就是从0开始的进行标定。则输出的结果如图所示:
0     1.01     3.02     4.03     NaN4    44.05     1.0dtype: float64DatetimeIndex(['2017-10-09', '2017-10-10', '2017-10-11', '2017-10-12',               '2017-10-13', '2017-10-14'],              dtype='datetime64[ns]', freq='D')                   a         b         c         d2017-10-09  0.827857  0.151108  0.265419  0.7920492017-10-10  0.280616  0.719324  0.556846  0.1940332017-10-11  0.538966  0.044244  0.572865  0.0818142017-10-12  0.560581  0.893978  0.861914  0.0770882017-10-13  0.850714  0.729712  0.003048  0.3082282017-10-14  0.051035  0.708464  0.715050  0.705602   0  1   2   30  0  1   2   31  4  5   6   72  8  9  10  11
再来看np.DataFrame()函数的另外一些用法,你可以给定一些数据包括索引之类的,如下所示:
df2 = pd.DataFrame({'A' : 1.,                    'B' : pd.Timestamp('20130102'),                    'C' : pd.Series(1,index=list(range(4)),dtype='float32'),                    'D' : np.array([3] * 4,dtype='int32'),                    'E' : pd.Categorical(["test","train","test","train"]),                    'F' : 'foo'})print(df2)print(df2.dtypes)print(df2.index)print(df2.columns)print(df2.values)print(df2.describe())print(df2.T)print(df2.sort_index(axis=1,ascending=False))print(df2.sort_values(by='B'))
就像df2的赋值一样,首先,我们可以查看它的各个数据的类型,输出也是以字典的形式。还可以查看index以及其类型,还可以查看横向的index以及其类型。除此之外,还可以查询df2内部的数据值,若想知道数据的总结,也是可以通过pd.describe实现的,翻转数据和前面Numpy中翻转矩阵是一样的,只不过一般不轻易去翻转,因为正如图中的翻转显示出来的效果就不那么直观和尽如人意了。如果想对index进行排序比如横向逆序排序或者是其他单单对数值进行输出,也是可以用这些方法去进行的。pandas是一个很好的模块,来源于numpy却在某些方面是高于Numpy的。下面我们将输出结果奉上:
  A          B    C  D      E    F0  1.0 2013-01-02  1.0  3   test  foo1  1.0 2013-01-02  1.0  3  train  foo2  1.0 2013-01-02  1.0  3   test  foo3  1.0 2013-01-02  1.0  3  train  fooA           float64B    datetime64[ns]C           float32D             int32E          categoryF            objectdtype: objectInt64Index([0, 1, 2, 3], dtype='int64')Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')[[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo'] [1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo'] [1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'foo'] [1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'train' 'foo']]         A    C    Dcount  4.0  4.0  4.0mean   1.0  1.0  3.0std    0.0  0.0  0.0min    1.0  1.0  3.025%    1.0  1.0  3.050%    1.0  1.0  3.075%    1.0  1.0  3.0max    1.0  1.0  3.0                     0                    1                    2  \A                    1                    1                    1   B  2013-01-02 00:00:00  2013-01-02 00:00:00  2013-01-02 00:00:00   C                    1                    1                    1   D                    3                    3                    3   E                 test                train                 test   F                  foo                  foo                  foo                        3  A                    1  B  2013-01-02 00:00:00  C                    1  D                    3  E                train  F                  foo       F      E  D    C          B    A0  foo   test  3  1.0 2013-01-02  1.01  foo  train  3  1.0 2013-01-02  1.02  foo   test  3  1.0 2013-01-02  1.03  foo  train  3  1.0 2013-01-02  1.0     A          B    C  D      E    F0  1.0 2013-01-02  1.0  3   test  foo1  1.0 2013-01-02  1.0  3  train  foo2  1.0 2013-01-02  1.0  3   test  foo3  1.0 2013-01-02  1.0  3  train  foo






原创粉丝点击