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
阅读全文
1 0
- python数据处理之numpy和pandas(中)
- python数据处理之numpy和pandas(上)
- python数据处理之numpy和pandas(下)
- python中numpy和pandas学习
- Python之Numpy之pandas
- python安装numpy和pandas
- Python中numpy和pandas中axis浅谈
- windows下 在Python中安装numpy和pandas
- python 中NumPy和Pandas工具包中的函数使用笔记
- Python数据处理pandas、numpy等第三方库函数笔记(持续更新)
- python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
- Python 之 安装 scipy,numpy,matplotlib,pandas
- python 数据处理学习pandas之DataFrame(一)
- python 数据处理学习pandas之DataFrame(二)
- python 数据处理学习pandas之DataFrame(三)
- Python之numpy教程(四):数据处理、绘图、数据统计分析
- numpy中std()和pandas中std()
- python+pandas+scipy+numpy
- 动画
- 安卓自定义View进阶-事件分发机制原理
- 【HDU1272】小希的迷宫(并查集)
- 隐藏应用程序窗口
- HDOJ 2099 整除的尾数
- python数据处理之numpy和pandas(中)
- Android Studio中http请求方式
- python之cookie的使用
- Java 内部类的总结
- 离线赛20171008总结
- Python 主动抛异常(raise)
- week1_09month
- java AWT 绘图
- 使用PHP的PDO类操作MySQL