python数据处理基础之pandas基础数据结构 -- Series
本章开始,我们来一起学习Pandas
这个库,之前介绍过,pandas是数据处理过程中非常重要的一个基础库。它拥有Series
与DataFrame
两大超实用的数据结构,使之可以方便地处理表格和其它复杂数据。pandas工作主要在数据清洗与分析上。但是,说得高大上,实质上,Pandas就是对各种表进行了抽象,以方便大家对表格进行处理的工具。
在介绍Pandas之前我们先来看看一张数据表,同时了解下pandas两个主要的数据结构DataFrame & Series
,本章将先详细介绍Series
,下一章再介绍DataFrame
:
从上面的图可以看出pandas就是对数据表进行处理的工具嘛~说得这么高大上,什么“清洗数据”、“加工数据”,其实就是牛逼点的代码版Excel~~
- DataFrame
其中,DataFrame代表一个表结构,比如上面的表,有表头(体检结果:身高、体重、年龄等),有表内容(各个学生的体检结果)。这其中,每一行内容我们称之为记录
(比如Peter这一行的体验结果就是一条记录
)。而每一列的表头我们称之为字段
(字段是用来索引的key),比如我们可以说Peter这条记录
中的“tall”这个字段
结果是120。
- Series
而Series
就是用来抽象一行记录的数据结果(比如我在图中圈出来的)。也就是单看这条记录,我们可以用Series
封装之。其中,记录的值称之为value
,如120、70这些数据。而其对应的字段
则称之为index
。而上面说过,字段是用来索引的key
,所以在Series
中,其索性称为index
了。比如Peter这个Series
,我们要获取他的体重,直接使用index索引获得,如peter['weight'] # output => 70
。
当然,Series
也可以用来抽象列记录,比如我们竖着看那张表,以weight
这条列来切分,则[peter、key、anna]则变成了index
,所以说这个数据结构还是抽象得非常灵活非常到位的。
下面我们就来深入学习下Series,看下怎么利用它来处理数据。
1 导图
(建议看每一章时,先把此导图打印出来对着看,好让自己对整体内容有个大概的把握与知道自己学习到哪个位置:)我自己做此笔记也是这样,把导图都打印出来,然后对着自己的笔记回顾,看完哪里就去哪里打个勾表示复习过一遍了)
2 Series的创建与基本操作
Series最主要的两个属性就是index
与value
。其中,index就是我们上面说的索引(也就是”字段”)。value就是每个字段的值。其中value是使用numpy的ndarray
结构表示的;index是pandas.core.indexes.base.Index
这个数据结构。比如我们下面创建一个Series细看下:
2.1 Series的创建
上面说了,Series最主要的两个属性就是index
与value
。
1 | import numpy as np |
1 | # 本文代码段中多次引用的log是我写的一个简单的输出对象的函数, |
可以看出,其主要的构造函数pd.Series
可以传入data与index,分别表示values与index这两个重要的数据结构。同时,这两个重要的数据结构也可以直接访问之。
2.1.1 指定Series的name,或其index的name
Series本身及index都可以有name属性。其中,Series本身的Name你可以理解为整个表记录的名字,而index的name则理解为表头的名字:
比如,peter.name='student'
,表示这是一张学生体检表,每条记录代表一名学生。peter.index.name ='result'
,表示表头是体检的结果。
1 | peter.name = 'student' # 表示这是一张学生体检表,每条记录代表一名学生。 |
2.1.2 使用ndarray数组来初始化Series
也可以直接使用数组来初始化Series,Pandas库会自动为之生成从0开始的序列作为index
1 | series = Series([1,3,5,7,9]) |
可见,左边那一列就是pandas自动生成的0开始的序列。
2.1.3 使用字典初始化Series
我们再仔细观察下Series后会发现,这个数据结构和py的字典dist结构有几分相似。Bingo!你除了可以将之视为一条记录切面之外,还可以将之视为一个定长的有序字典~比如你可以这样使用字典来初始化之:
1 | data = { |
其中,字典的keys变成了所生成的Series的index。而value就是Series的values啦~
既然如此,你就会想到,Series是否也能为字典一样索引访问呢? —- 又Bingo!Series的索引访问不仅如字典一样方便,甚至还要更加强大!!
3 索引访问
Series的索引访问可以根据index的值访问到对应的value(注意这个方向,只能根据index找value,不能反过来,这点和dict结构也挺像的!)。
然后,Series的索引访问增加了dict所没有的一些常用的功能,比如:过滤、包含判断等。我们直接通过下面的源码来一探究竟。
1 | # 根据 index 取值 |
4 Series提供的数据处理方法
Series提供了许多数据处理方法,下面介绍的一些处理方法很多会涉及到以后会介绍的数据清洗、数据聚合等,大家可以先大致看下有个大概有印象即可。记住,学习时整个知识体系是需要过N遍的,而前面的几遍尽量做到不求甚解,只对整体做了解与把握。
4.1 缺失值的处理
当我们构造Series或是在实际项目中运用时,难免会遇到缺失值。比如下面的示例,这是一张简单的key-value二维表,表示各大洲的选票数量。但是有个洲的选票就缺失了:
1 | vote = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000} |
Pandas中,NaN
表示缺失值(Not a Number)。我们可以使用pd.isnull(s) 或是 pd.notnull(s)方法将之“捉出来”:
1 | log('pd.isnull(s)', pd.isnull(s)) # 也可以直接 s.isnull() |
结果会返回一个新的Series,value表示原Series的值在此处是否为空。
这样如果我们要将有空值的key-value去掉怎么做呢?还记得前面说的过滤索引
吗~~直接s[s.notnull()]
,这就是所谓的数据清洗
了!
1 | log('数据清洗', s[s.notnull()]) |
5 小结
作为小结和对本章的练习,大家可以试着在纸上算算下面程序的输出,并亲自复制到源文件中执行对比看自己对了多少:
1 | # -*- coding: UTF-8 -*- |
6 引用
- 《利用python进行数据分析》 - WesMcKinney著,SeanCheney译 - WesMcKinney是pandas的开发者,所以必须是讲解numpy、pandas等数据处理工具最权威的专家了,他的这本书写的很简洁很易读,SeanCheney翻译的也是非常完美。十分值得推荐的。