一、Pandas库
与我们之前用到的NumPy库以及我们之后会用到的Matplotlib等库一样,Pandas库也是一个被大家广泛使用的一个第三方库。大家主要用它来进行数据分析的操作,这也是为什么我们这门课要来学习它的原因之一。
在Pandas库中我们经常会跟它其中的两种数据类型打交道:Series
和DataFrame
。相比于我们上一章学习的数组
,Series
和DataFrame
最明显的特点在于它们拥有行/列索引
,这使得我们处理数据变得更方便。
二、DataFrame对象
我们变换一下讲解的思路,我们先来讲DataFrame对象。
DataFrame对象我们可以直观地理解为一张表格:
我们可以从上图看到,相较于光秃秃的只有数据本身的array
类型来说,DataFrame
类型额外拥有了行/列索引
,这就给我们提供了额外的信息,也为我们之后处理数据带来了更多的便利。
三、Series对象
如果已经理解了DataFrame,那么Series对象就很容易理解了。Series对象可以看做是DataFrame对象的退化,它有且仅能有一列数据。如果我们把DataFrame的一列切出来,那么它就“退化”为了Series对象。
不过需要注意的是Series和“只有一列的DataFrame”对象还是有所不同的:
四、常用操作
0. 导入库
import pandas as pd
1. 创建DataFrame
形如:my_df = pd.DataFrame(数据本体, columns=列索引, index=行索引)
,其中数据本体应为二维数组(列表);列索引应为一维数组(列表);行索引应为一维数组(列表)。如:
my_df = pd.DataFrame([[1,2,3,],[4,5,6]],columns=['a','b','c'],index=['x','y'])
生成的DataFrame如下:
2. 从文件中读取并生成DataFrame
- 读取CSV文件:
pd.read_csv('文件地址')
- 读取Excel文件:
pd.read_excel('文件地址')
除'文件地址'
为必填参数外,还有以下几个比较常用的关键字参数
参数 | 作用 |
sep = ‘,’ | 读取在CSV文件时指定分隔符为 |
header = None | 参数为 |
names = [ ‘a’, ‘b’, ‘c’ ] | 列表,定义列索引 (如果不使用文件中第一行为列索引) |
index_col = 0 | 指定文件中第 |
skiprows=[0, 2, 3] | 跳过文件中的 |
nrows=5 | 读取文件中的前 |
3. DataFrame的切片
正因为DataFrame多了行/列索引
这个东西,所以我们有两种切片的方式:
- 基于位置序号切片。说白了就是告诉程序我要切第几行第几列。
形如my_df.iloc[ indexList, colList ]
。其中indexList
和colList
是里面装有整数的列表 - 基于行/列索引名切片。说白了就是告诉程序我要切名字是xxx的那一行/列。
形如my_df.loc[ indexList, colList ]
。其中indexList
和colList
是里面装有字符串的列表
更多有关的数组的切片和DataFrame的切片的异同,可以参考【Numpy Pandas】ndarray与DataFrame切片时的异同(二次切片)
4. DataFrame的条件筛选
我们所谓的数据筛选其实都只不过是以布尔型数组为载体的按位置切片。所以也会有my_df.iloc[ ]
和 my_df.loc[ ]
两种形式。
我们以一个例子来说明DataFrame的条件筛选:
我们有一个DataFrame叫做students
age | height | weight | |
1 | 19 | 170 | 68 |
2 | 20 | 165 | 65 |
3 | 18 | 175 | 65 |
我们要选取大于身高170的同学
students['height']>=170
1 True
2 False
3 True
Name: height, dtype: bool
可以看到,当一个DataFrame
的一列(实际上就是一个Series对象
)和一个值
做逻辑运算的时候,会返回一个形状一样的布尔型Series。
我们将此运算得到的Series对象赋值给mask
:
mask = students['height']>=170
然后就可以再用.iloc[ ]
和 .loc[ ]
选取想要的列,如:
students.iloc[list(mask),[1,2]] #条件筛选行+按位置号切片列
height | weight | |
1 | 170 | 68 |
3 | 175 | 65 |
students.loc[list(mask), ['height', 'weight']] #条件筛选行+按列名切片列
height | weight | |
1 | 170 | 68 |
3 | 175 | 65 |
有一个细节需要注意,当我们使用.loc[ ]
进行筛选的时候,第一个参数可以是布尔型列表或者布尔型Series;而我们使用.iloc[ ]
进行筛选的时候,第一个参数必须是布尔型列表。这就是为什么上面的代码中我用了list(mask)
强制类型转换。
五、总结
这一篇博客简要地介绍了Pandas库及其Series和DataFrame对象,介绍了Series和DataFrame之间的关联。
其实DataFrame对象还是比较好理解的,毕竟它和我们日常生活中接触的各类表格很像。
我们还整理了常用的一些操作,如:创建对象、读取文件、切片、条件筛选等。