一、整体介绍
前面我们介绍了numpy,但numpy本身并没有多么高级的数据分析功能,但是理解numpy数组以及面向数组的计算有助于你更加高效地使用诸如pandas之类的工具。numpy要介绍的才是我们在数据分析领域使用的非常多的一个库——pandas
。
相比于numpy,pandas还提供了一些NumPy所没有的更加领域特定的功能,如时间序列处理等。
对于大部分数据分析的应用而言,关注的功能主要集中在:
- 用于数据整理和清理、子集构造和过滤、转换等快速的矢量化数组运算
- 常用的数组算法,如排序、唯一化、集合运算等
- 高效的描述统计和数据聚合/摘要运算
- 用于异构数据集的合并/连接运算的数据对齐和关系型数据运算
- 将条件逻辑表述为数组表达式(而不是带有if-elif-else分支的循环)
- 数据的分组运算(聚合、转换、函数应用等)
1.1 Pandas 优点
1)具备 按轴 自动或显式 数据对齐功能,可防止许多 由于数据未对齐 以及 来自不同数据源(索引方式不同)的数据 而导致的常见错误
2)集成
时间序列
功能3)既能处理
时间序列数据
也能处理非时间序列数据
的数据结构4)数学计算和约简(比如对某个轴求和)可以根据不同的元数据(周编号)进行
5)灵活处理 缺失数据
6)合并 及 其他出现在常见数据库中的 【关系型运算】
1.2 Pandas的数据类型
Series 和 DataFrame
1.3 Series 和 DataFrame 共性
索引和列信息查看
pandas数据类型 与 numpy ndarray 的 最大区别是 有自定义索引
(Series有index
,DataFrame有index
和column
)
df.index
df.columns
df.index.name
df.column.name
df.values # values 属性会以ndarray的形式返回DataFrame中的数据
df.name # 显示列标签
# in关键字 判断某个index或column是否存在
'index1' in df.index
'column1' in df.columns
标量化计算
obj[obj > 0]
obj * 2
np.exp(obj)
查看是否包含某个元素值
'b' in obj
'c' in obj2
二、Series和DataFrame常用操作
2.1 Series
当为series对象,指定索引的时候,会自动遵循
索引对齐
原则
-----> 同理,对两个index不太一致的 series对象,进行合并处理的时候,index也会遵循 自动对齐 的原则
2.1.1 创建Series
Series是一种类似于一维数组的对象,它是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成,仅由一组数据即可产生最简单的Series。
- 创建Series时,可以自定义索引:
obj = Series([4, 7, -5, 3], index = [‘d’, ‘b’, ‘a’, ‘c’])
- 如果数据别存放在一个Python字典中,也可以直接通过这个字典来创建Series。(可自行定义索引顺序,若传入的索引列表中有的项在字典里找不到,则对应行的值为NaN)
sdata = Python字典
obj = Series(sdata)
-
对于许多应用而言,Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据。
-
Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切。
-
Series的索引可以通过赋值的方式就地修改。(索引可以修改)
2.1.2 Series的索引操作
只适用于Series,因为它只有一列值,默认根据该列值排序即可。
.argmin(), .argmax() # 计算数据最大值, 最小值所在位置的索引位置(自动索引)
.idxmin(), .idxmax() # 计算数据最大值, 最小值所在位置的索引(自定义索引)
如果是针对DataFrame的操作,可以将DataFrame的指定列提取出来成为Series再判断。
df['value1'].argmin()
df['value1'].argmax()
df['value1'].idmin()
df['value1'].idmax()
NumPy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的链接。
2.2 DataFrame
2.2.1 创建DataFrame
创建DataFrame对象 用np.DataFrame
方法
如果传递给 np.DataFrame方法的 是一个嵌套字典,则
最外层字典的键 作为列索引,内层键 作为行索引
。
------> 内层字典的键 会被合并、排序 以形成最终的索引。如果显式指定了索引,则还是会根据 索引对齐 原则。
- 可以输入给 DataFrame 构造函数的 数据
序号 | 类型 | 说明 |
---|---|---|
1 | 二维ndarray | 数据矩阵,还可以传入行标和列标 |
2 | 由数组、列表或元组组成的字典 | 每个序列会变成DataFrame的一列,所有序列的长度必须相同 |
3 | Numpy的结构化/记录数组(ndarray) | 类似于2 |
4 | 由Series组成的字典 | 每个Series会成为一列,如果没有显式的指定索引,则各Series的索引会被合并成结果的行索引 |
5 | 由字典组成的字典 | 各内层字典或成为一列,键会被合并成结果的行索引,类似于4 |
6 | 字典或Series的列表 | 各项会成为DataFrame的一行,字典键或Series索引的并集将会成为DataFrame的列标 |
7 | 由列表或元组组成的列表 | 类似于1 |
8 | 另一个DataFrame | 改DataFrame的索引将会被沿用,除非显示指定了其他索引 |
9 | Numpy的MaskedArray | 类似于1,只是掩码值在结果DataFrame会变成NA/缺失值 |
- 实例(创建及reindex)
import pandas as pd
d1 = {
'城市': ['北京', '上海', '广州', '深圳', '沈阳'],
'环比': [101.5, 101.2, 101.3, 102.0, 100.1],
'同比': [120.7, 127.3, 119.4, 140.9, 101.3],
'定基': [121.4, 127.8, 120.0, 145.5, 101.6]}
d = pd.DataFrame(d1, index = ['c1', 'c2', 'c3', 'c4', 'c5'])
print(d, '\n', d.shape)
#重排索引
e = d.reindex(index = ['c5', 'c4', 'c3', 'c2', 'c1'], columns = [<