![dbc1ed56451b2967c0914dfa1472a2c6.png](https://i-blog.csdnimg.cn/blog_migrate/66edf504bf51b48f23838bd02591b8ed.jpeg)
sh说明:本pandas非卧龙的pandas,而是Python众多科学计算包中的pandas。
本次Pandas的简洁介绍,针对的是此包的新手,但已假设你已懂得Python语言的基本语法,以及安装了Pandas包。如需了解更多Pandas包的高级用法,请移步此链接:
Cookbook - pandas 0.25.3 documentationpandas.pydata.org![295152f2e091a1d9446a80a0f20d37f4.png](https://i-blog.csdnimg.cn/blog_migrate/e7db4a22cba8a775001909f97fd9180e.png)
(一)给使用者的话
pandas拥有简洁、优雅、明确的两种基本数据结构,此二者将使对关系型数据的处理变得便捷和直观。
pandas的以上特点使它的用户在分析来自现实世界(无论是观测值还是统计值)的数据方面,可以不关注其内部实现细节,做到“拿来即用”。
此外,pandas有它自己更好的愿景,那就是做一个可以对接任何编程语言的开源数据分析工具。
适用于pandas的数据类型很丰富。
- 例如表格型数据,就像SQL表格和Excel表格中的数据结构(译者的话,Pandas的实现机制不要求每一列的每个数据值都同属一个Python语言的内置数据类型,但使用同一数据类型,可使程序的运行时间缩短。)
- 有序的和无序的(不要求频率相同)时间序列数据。
- 任意拥有列标签和行标签的矩阵数据,矩阵里面的数值数据类型可要求不同(译者的话,我觉得在此,仍然使用相同数据类型好一点,使用不同数据类型对时间要求不可能不变,假设为O(n),想一想,如果你处理百万数量级数据呢?对为i5的电脑恐怕也是够呛的吧?提升到千万级别呢?)
- 任何其他的观测值和统计值数据集。这些数据就真的不必带着标签奔入pandas的怀抱了。
Pandas拥有两大内置数据结构,一维数据结构-Series,二维数据结构-DataFrame。这两个数据结构被广泛应用于处理金融、统计、社会科学和其他工程领域。对于R语言的使用者来说,DataFrame带来了远远超过R语言data.frame提供的便利。pandas是基于Numpy而建立的(当然,绝不是对Numpy的简单包装),通过与其他Python包结合,旨在共同建立一个可用来进行科学计算的环境。
pandas擅长哪些事呢?
- 处理缺失值,无论是在浮点数和非浮点数中;
- 可调整大小:比如在二维数据结构的列可被增加或者删除,在更高维的数据结构中亦如此;
- 自动的和明确的数据值对齐,此种操作通过数据集的标签来对齐,或者使用者跳过标签,让Series互相对其或者DataFrame互相对齐,如果在你的计算中,你有此必要。
- 强有力和灵活的聚合函数,让你在执行分列、合并、使用其他函数去计合、转置数据时显得得心应手。
![ad39f833d20608ebb8457eb474b1839d.png](https://i-blog.csdnimg.cn/blog_migrate/e72d4f96a56d026a5b818f3664c2ed5e.png)
- 在Numpy和Python的其他数据结构中,若存在着数据值类型凌乱的、索引不同的数据集,你可以使用Pandas很方便地将其转换为Pandas的DataFrame对象。
- 对较大的数据集实现以列标签为基础地切片、索引和子设置。
- 直观地合并和加入其他数据集。
- 灵活地调整和透视其他数据集。
- Hierarchical labeling of axes (possible to have multiple labels per tick)轴的分层标记中(这里的轴就是:比如一个有三张表(三张DataFrame)的数据集中,则每一张表就是一个轴,而tick表示是对列的抽象,每一个具体的列对象用一个列标签表示,若仍有疑惑的,可翻一翻此链接https://matplotlib.org/api/axes_api.html?highlight=axes#module-matplotlib.axes)。
- 便捷的数据导入导出接口,这些数据可来自CSV或者txt文本,execl文件,数据库,以及HDF5文档。
- 时间序列数据的特殊处理,比如日期范围的生成,抽取频率的确定,移动窗口、线性回归,日期偏移和滞后等(可看看,这个链接https://zhuanlan.zhihu.com/p/92349149)。
以上这些原则可以帮助我们克服使用其他语言的科学计算包而遇到的不便。
数据的科学计算通常被拆解成以下的流程:
- 清洗和一致化数据;
- 分析和建模;
- 可视化数据分析结果;
pandas对其中的各个流程都是理想的工具。
pandas还有其他特点
- pandas的运行效率高。因为Cython像C语言一样接近底层的算术运算单元,而Cython是一种编译型语言,旨在用来实现CPython拓展模块(或许这个链接解释地更清楚,https://cn.bing.com/search?q=what%20is%20Cython%20code&qs=n&form=QBRE&sp=-1&pq=what%20is%20cython%20code&sc=1-19&sk=&cvid=90868BB6518047D88FECB36BE1DED43D),pandas就是其中的拓展模块。
- pandas是一个独立地统计计算模块,这使它成为Python科学计算系统中地重要组成部分。
- pandas在金融数据分析应用中具有可拓展性。
Padnas数据结构
![5dacdce122df9619ee09a9d89c539ec0.png](https://i-blog.csdnimg.cn/blog_migrate/f0974945ed2931a05a5ef0f692475710.jpeg)
![75e2f6543080ab6b50135dcdb807a84f.png](https://i-blog.csdnimg.cn/blog_migrate/71c52b142f51e80788914534edde59ae.jpeg)
为何不止一种数据结构?
我们何不认为pandas数据结构是其更低维度数据结构的容器呢?比如,DataFrame是序列的容器(如上图所示),序列是标量的容器(标量就是一个具体的数值)。我们可以像使用Python内置数据结构dict一样对这些容器对象进行插入或者移除。
对于使用过Numpy中ndarray的人来说,会问:对时间序列或者样本数据集的方向控制,pandas会提供哪些API方法呢?
译者举个实例
![2bc14db73560bf0d5659d41389b56c76.png](https://i-blog.csdnimg.cn/blog_migrate/422cc8aa63bafe85e6b5abe76836c006.png)
假设我们导入一个6维数据呢,若以此方法,这是不是让人眼花缭乱呢?
但pandas的表格型数据结构(DataFrame)使用索引(表示行)和标签(表示列)来帮助大家减轻这种精神负担。
DataFrame中的列是可迭代的对象,说明如下:
for col in df.columns:
series = df[col]
# do something with series
数据的可变性和数据复制
所有pandas数据结构中的数值都是可变的,但不是所有数据结构中的大小是可变的。
比如,Series的长度是不能改变的,但是列缺可以被插入DataFrame中。然而因为有大量产生新DataFrame对象的方法,因此可以让新进来的数据进入新表中。保持DataFrame的大小不变,在大多数情况下是个明智的选择。
(二)正式介绍pandas的方法
![19b7af36a6baf693c971363a1ce4624c.png](https://i-blog.csdnimg.cn/blog_migrate/480f1cc337360ac567ccac7d229f9727.jpeg)
本次翻译包含这样几个方面:
(1)对象的创建
Pandas的基本数据结构为序列和dataframe
(2)数据查看
以行的方式、以列的方式、以索引的方式、以Numpy数组的方式、以转置的方式、以轴的方式、以某一列作为筛选列的方式
(3)数据索引或切片、定位
以索引来选择选择数据,方法自然被称为数据索引,选取某(几)列或某(几)行,方法自然被称为数据切片;选取数据通过类似于横纵坐标的方式,方法自然被称为数据定位;
增加列的方式
作为以上的拓展,还有以布尔值判断作为数据索引或切片、定位的方式,以及增加列;
(4)缺失值的处理
Pandas在处理缺失值方面,使用其自定义的方法,np.nan。
(5)使用Pandas处理数据的基本方法
比如在数据清理方面,pandas有其可直接使用的方法,但实际中,数据清理过程可能略显复杂,因此还可以使用Pandas的apply函数,它是以其他函数作为参数。
(6)值计数
(7)处理字符串的方法
这里要求Series内部值得数据类型为字符,而后便按照字符串惯有的处理方法,比如典型的有字母序。
(8)合并和加入
对于Series和DataFrame对象的合并,pandas提供了许多便捷的方法,比如join和merge-type操作。
不过,此合并的内部逻辑是:按照索引值来合并在一起或者进行算术运算。
(9)聚合函数
聚合函数(group by)大大减少了我们对pandas数据对象进行复杂操作的步骤。
它可以和其他函数写在同一行代码中,通过“点语法”。
这些复杂操作方法包括如下:
- Splitting
- Applying
- Combining
(10)栈
(11)透视表
(12)时间序列
pandas在样本选取方式的修改上,有着堪称简洁、优雅、明确的方法。涉及的方式修改上包括频率的修改、时间戳的修改。
这些方法可以被运用在但不限于金融数据的处理上。
(13)数值类型化
DataFrame是能够容纳一些表属性的数据的。
(15)可视化
在DataFrame或者Series对象中,实现数据可视化可用plot()方法。
(16)数据的导入与导出
支持的格式有csv、text、xlsx。
(17)异常
正式开始
- 导入此包的规范
![a5f8f63f76691a6efcc2f7ea283d6359.png](https://i-blog.csdnimg.cn/blog_migrate/d412aab73aeeccd1675e777153daf390.png)
2.对象创建
通过以list作为参数,来创建一个Series对象,pandas给这个对象加上默认的索引值。
![ac180ac7f255563dc86f99d75041a547.png](https://i-blog.csdnimg.cn/blog_migrate/2b6a87197161d1b0d55b5a71dbd24053.png)
![cfbcc6eb5354a9a95c03db4890fe47ad.png](https://i-blog.csdnimg.cn/blog_migrate/7def8393e5245ede448ca11b5b6c63d1.png)
通过以Numpy数组作为参数,创建一个DataFrame对象,日期时间对象作索引,并且给它加上列标签。
![5a6e4ccc7c0d7295a03763a64d5715a4.png](https://i-blog.csdnimg.cn/blog_migrate/b3f781c437c96a0646bda3cb0c6eacde.jpeg)
通过传入dict作为参数
![d9d24c5d61f8eddfa5a9ef53ede5cc00.png](https://i-blog.csdnimg.cn/blog_migrate/fdf5dba4a9943f825d37b161f4367c74.jpeg)
此时,每个列的数据类型可不同。
![bd5466ab35de62d75deb576b385bd852.png](https://i-blog.csdnimg.cn/blog_migrate/87e39fe1d56c1935410eb684582b3c4a.png)
3.查看数据
怎样查看DataFrame的最上面几行和最下面几行呢?
![8e3f2812a5d8ed0256f0c207e1e18247.png](https://i-blog.csdnimg.cn/blog_migrate/d1e290969768396a5562c9b0d366be84.jpeg)
显示索引和列名
![56f172c4bbf9933f4dcd03dc1eb2d02c.png](https://i-blog.csdnimg.cn/blog_migrate/b0a79f942e6f35dc74e81a554904de51.png)
DataFrame.to_numpy()给了我们一个像查看数组一样得方法,不过数组还有索引,此方法返回得结果既无索引,也无列名。
如果使用此方法,一旦列之间得数据类型不同,则付出的时间代价是很大的,这或许来自pandas和numpy的基础性差别:Numpy的数组是一种数据类型,而pandas得DataFrames的列与列之间可为不同数据类型。但DataFrame拥有两种或两种以上的不同数据类型时,DataFrame.to_numpy()返回的结果有一个表示此结果为object的对象,object为Python语言中抽象级别最高的对象,比如所有类都是从object继承过来的。
![ad502f769dd9aecd60589c7e533d2077.png](https://i-blog.csdnimg.cn/blog_migrate/ec82732f651c533ceab544c5b08111d3.jpeg)
describe()可以对数据做描述性统计。
![27798b5e4dc655c2ea5eec7343a2ed3f.png](https://i-blog.csdnimg.cn/blog_migrate/898dc84853cef3ded3f1d2fdbb3a5d16.jpeg)
数据转置
![7da82abd72f342eb73658bbde5642242.png](https://i-blog.csdnimg.cn/blog_migrate/f0844db63f22a5b4ebe5b803549f3502.jpeg)
通过列排序
![ecf0af50cf1ee64e5d022933cbd83298.png](https://i-blog.csdnimg.cn/blog_migrate/316724a05ef895248f9ccebda94ed8a5.jpeg)
![d6799d5780c169867cfa4d90f2fd16f1.png](https://i-blog.csdnimg.cn/blog_migrate/fc60f66c87919e595623f6531e8d928c.jpeg)
![c520f8edad57fa2a2aa5108f6f48ecc4.png](https://i-blog.csdnimg.cn/blog_migrate/1029b681b458bb429a4867be98f1107d.jpeg)
通过值排序
![62e80c819e68508f7cbe6f4d05dd2a4f.png](https://i-blog.csdnimg.cn/blog_migrate/0f2e2f4d107b5ed8abc58f0f7c0614a1.jpeg)
![943dd045e6fdb4ac24a448e77e9372a4.png](https://i-blog.csdnimg.cn/blog_migrate/b5912ccc8556087a853cec673ddcbf6b.jpeg)
![6c3b70ad7f8e2d84d026931094867a30.png](https://i-blog.csdnimg.cn/blog_migrate/5c99c75d5e6db6a702aec8f449892c32.jpeg)
选取
1.Getting
选取一个单列,返回一个Series对象,效果等同于df.A
![3283847d443decd9a6f01eb93e0c6a12.png](https://i-blog.csdnimg.cn/blog_migrate/6dae76dfd162a6cbb01581d25b466f60.png)
通过[],可以对行进行切片
可以自己传入表示区间的整数
![0aeea44fa4bb64129bc3fd5ab915b954.png](https://i-blog.csdnimg.cn/blog_migrate/1c1ad6575980fbedc3eef6cb3f8d3852.png)
也可以传入索引
![c5324822d6466deab977422165e6b9e4.png](https://i-blog.csdnimg.cn/blog_migrate/17b601491f3ecf47fe93d79b389abd84.png)
通过loc函数
1.传入某一索引值,返回此索引值所在行的全部数据值。
![ffc41dc7d68b26f59d8ea1da76c9ea35.png](https://i-blog.csdnimg.cn/blog_migrate/2a900289fdc1decf090185c234a07027.png)
2.传入两个参数,两个参数都可作为目标范围。
![ce1e8b0bd7bcc57b2e050f19b41773f7.png](https://i-blog.csdnimg.cn/blog_migrate/16e067e212e32578e60517e21467d8e7.png)
![743a53863e160e6933098e5e5c2d8b15.png](https://i-blog.csdnimg.cn/blog_migrate/285b8758cee090cc16c8f6b3b45eb1d1.png)
倘若要得到一个具体的标量值呢?
![02da9ba78072f26021ee0d01d136a722.png](https://i-blog.csdnimg.cn/blog_migrate/8f996183c5ab0365059e728b9e5fa1bf.png)
定位
不管你传入几个一个参数,还是两个参数,第一个参数一定是表示索引的区间,第二个参数表示列的区间。
比如我要选取每一列的第三行
![dc9dbdf74ac3331a44e2496894bc5e05.png](https://i-blog.csdnimg.cn/blog_migrate/ec467d99a1bbfbd43e2030407d523e2b.png)
比如我要选取一二列的第四行和第五行呢?
![0d13b864f40a6506db9d41cd94e1b574.png](https://i-blog.csdnimg.cn/blog_migrate/225651b9328a8af6ba78a616bb7a52a7.png)
比如我要隔一行隔一列的取呢?
![9bb33ed4e92e5f0f2964d9e225d6fbc5.png](https://i-blog.csdnimg.cn/blog_migrate/cdf1cd1fdb9019f07726ec95564524cb.png)
如果我要索引列只选取部分,而选择全部其他列呢?,没错!用‘:’来作贪婪匹配!
![3f1e091ac65d92df35b426e400431234.png](https://i-blog.csdnimg.cn/blog_migrate/4a056672db3df8d985ab565b7c204c4c.png)
如果要选取全部索引列呢?没错,我们也用贪婪匹配,
![f015dfde4645e5aa17c328d985c1e14e.png](https://i-blog.csdnimg.cn/blog_migrate/9b64a4cff10ab27e85514178bc1b0901.png)
如果要实现精确打击呢?根据上面的推理,我们给每个位置参数传入一个整数就行了。
![428f3fd524cd3361ef2cef871b77282f.png](https://i-blog.csdnimg.cn/blog_migrate/0fbf6cd6cdc6e5c0bcca013b8fdf645b.png)
用boolean值来选取
如果我们要选取想某一列的值全部大于零呢?
![828fe531c1612abbd380b4571353489e.png](https://i-blog.csdnimg.cn/blog_migrate/7f2542800899824171a9e758865db57c.png)
如果我们想对DataFrame表格全部大于零的值进行选取呢?
![63476c24ab0ba8e71c029f7957c58cc3.png](https://i-blog.csdnimg.cn/blog_migrate/42459b9a7b677a9b255544b9dc226703.png)
假如我们像选取某个特定的数据值呢?
![12d4fb77a7a50e48189a75dd6ce81291.png](https://i-blog.csdnimg.cn/blog_migrate/3d9ecc8352dfcfef18347e5fdd6eb4ad.png)
假如我们要加一个新的列呢?
这里我们先创建一个新序列,毕竟你的有数据加上去啊!
![993e6a8904d2c3abdd4a3e9d14de85f6.png](https://i-blog.csdnimg.cn/blog_migrate/fe0601cf55b932725025860e9fdcf897.png)
加入一个新的列,
![0dd133f47070d8ef480d942c7299f7fe.png](https://i-blog.csdnimg.cn/blog_migrate/464a4da8910641a7602493ddbf154279.jpeg)
倘若我们要对某一值进行重置呢?道理是一样的,先进行定位,定位之后再赋值
![d3648d3f70fcfd2c54d1f82be6caf6aa.png](https://i-blog.csdnimg.cn/blog_migrate/469dddb5ad21ff1feb14dcff9812f9ed.jpeg)
此时第二种方法,写法上更简单点,只需传入两个合理的整数即可,没错就是iat函数了,
![be808694e6fd79bc1d8738bfc7bfad38.png](https://i-blog.csdnimg.cn/blog_migrate/2b7b1893088e2923aedbadbba5d8f6d5.jpeg)
把某个列的值全部进行替换,也是进行定位,然后再赋值。
![a0ae156fc8b8780d87d8c1fac32279c6.png](https://i-blog.csdnimg.cn/blog_migrate/d9fc0c7ddba0358c34344a6a85d95354.jpeg)
还可以用布尔值进行定位,然后再赋值
![3f5beeb1511a7bfdfc3d964fa3e074c7.png](https://i-blog.csdnimg.cn/blog_migrate/58f5607947b590e80f06396b4dbf3e6c.jpeg)
以上便是查看数据部分,很简单吧,拿来就用!!!,现在介绍缺失值处理部分!!!
处理缺失值
对于缺失值,我们是不能进行任何计算的!
我们先根据df创造一个新的dataframe出来,这个新的dataframe具有如下特点,首先它的索引值变成了4个,然后增加一个新的列,新列的部分值成为了1.这样,我们可以复习下,上卖弄的方法。
没错,这里的主要需要解决的就是重置索引值,我们使用reindex函数。
![792d0a30d6bc727bd52c57ce92ee42ba.png](https://i-blog.csdnimg.cn/blog_migrate/1b45515737256576f0a796b44fffd3ed.jpeg)
假设我们要删除有缺失值的每一行呢?,使用dropna函数,传入how条件表示的参数
![8e640b566a5b7fc0e5bd507add08e138.png](https://i-blog.csdnimg.cn/blog_migrate/9fba5ead5c792b37cb6fe2be0673a249.png)
如果我们想给缺失值补上一个值呢?
![10039ef2c36859d483f10d2354bc1f7b.png](https://i-blog.csdnimg.cn/blog_migrate/6f856134a61ae0ce46f2d7d287896610.png)
如果我们想把缺失值用True来表示呢?以方便进一步使用统计推断方法呢?
![3b408166585f6b89bb04e70b4befc134.png](https://i-blog.csdnimg.cn/blog_migrate/5900e6c1f0578cf8276f402372e37759.png)
现在就开始对数据使用初步的统计推断方法了。
求平均值
假如我们想求每一列的平均值?
![8f02457be622726b16ae523b15a9aac9.png](https://i-blog.csdnimg.cn/blog_migrate/34240fd10ee20a3087c22352a9351b2f.png)
假如我们想求某一行的平均值?
![cde089ccfad30f26578940809eb133b9.png](https://i-blog.csdnimg.cn/blog_migrate/321cec66b15f359e6e9973427334294d.png)
![adcc334660c50ab002596e6c94ab9781.png](https://i-blog.csdnimg.cn/blog_migrate/4f685bc2b0a18d355ee309115495fe2a.jpeg)
![1ff37af7cc0d1d5896cd214759c902f6.png](https://i-blog.csdnimg.cn/blog_migrate/9bf51ac6b0d1018195f02f2f0e3dd457.png)
今天先改到这了。。。。。。