pandas库入门 北理工嵩天老师python数据分析与展示 单元7随堂笔记
Pandas是Python第三方库,提供高性能易用数据类型和分析工具。
import pandas as pd
Pandas基于NumPy实现,常与Numpy和Matplotlib一同使用。
d = pd.Series(range(20))
d
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
dtype: int64
d.cumsum()
0 0
1 1
2 3
3 6
4 10
5 15
6 21
7 28
8 36
9 45
10 55
11 66
12 78
13 91
14 105
15 120
16 136
17 153
18 171
19 190
dtype: int64
Pandas库的理解
两个数据类型:Series 、DataFrame
基于上述数据类型的各类操作:
基本操作,运算操作,特征类操作,关联类操作
NumPy Pandas
基础数据类型 基于np.array的扩展数据类型 Series 、DataFrame
关注数据的结构表达(即数据之间的维度表达) 关注数据的应用表达(如何提取、运算)
维度:数据之间 数据与索引间关系
Series类型
Series类型由一组数据及与之相关的数据索引组成
图四
a = pd.Series([9,8,7,6])
a
0 9
1 8
2 7
3 6
dtype: int64
b=pd.Series([9,8,7,6],index=['a','b','c','d'])
b
a 9
b 8
c 7
d 6
dtype: int64
Series类型可以由如下类型创建
(1)标量值
s=pd.Series(25,index=['a','b','c'])
s
a 25
b 25
c 25
dtype: int64
(2)python 字典
d=pd.Series({'a':9,'b':8,'c':7})
d
a 9
b 8
c 7
dtype: int64
e=pd.Series({'a':9,'b':8,'c':7},index=['c','a','b','d'])
e
c 7.0
a 9.0
b 8.0
d NaN
dtype: float64
(3)ndarray
import numpy as np
n=pd.Series(np.arange(5))
n
0 0
1 1
2 2
3 3
4 4
dtype: int32
m=pd.Series(np.arange(5),index=np.arange(9,4,-1))
m
9 0
8 1
7 2
6 3
5 4
dtype: int32
(4)其他函数
如range()
o=pd.Series(range(5),index=np.arange(9,4,-1))
o
9 0
8 1
7 2
6 3
5 4
dtype: int64
可以看到pandas与很多数据都具有兼容性
Series类型的基本操作
Series类型包括index和values两部分。
Series类型的操作类似ndarray类型。
Series类型的操作类似Python字典类型
b=pd.Series([9,8,7,6],['a','b','c','d'])
b
a 9
b 8
c 7
d 6
dtype: int64
b.index
Index(['a', 'b', 'c', 'd'], dtype='object')
b.values
array([9, 8, 7, 6], dtype=int64)
**Series类型实际上是将Numpy中的类型作为保留值的类型,索引是pandas内部新建立类型叫index
index类型和numpy中的array类型结合到一起就是Series类型 **
b['b']
8
b[1]
8
虽然用户自定义了索引,但它自动生成的索引也存在。
注意 : 使用索引必须使用一致的索引方式,不能混用,同时使用时会被当作自定义索引。
Series类型的操作类似ndarray类型
如:
1.索引方法相同,采用[];
2.NumPy中运算和操作可用于Series类型。
3.可以通过自定义索引的列表进行切片。
4.可以通过自动索引进行切片,如果存在自定义索引,则一同被切片。切片后仍然是Series类型
pd.Series([9,8,7,6],['a','b','c','d'])
b
a 9
b 8
c 7
d 6
dtype: int64
b[3]
6
b[:3]
a 9
b 8
c 7
dtype: int64
b[b>b.median()]
a 9
b 8
dtype: int64
Series类型的操作与Python字典类型也有类似之处
如:
1.通过自定义索引访问
2.保留字in操作。不会判断自动索引,只会判断自定义索引
3.使用.get()方法
b['b']
8
'c' in b
True
0 in b
False
b.get('f',100)
100
Series对象的对齐操作
Series+Series
Series类型在运算中会自动对齐不同索引的数据,这种运算更加精确,更不容易出错。
a=pd.Series([1,2,3],['c','d','e'])
b=pd.Series([9,8,7,6],['a','b','c','d'])
a+b
a NaN
b NaN
c 8.0
d 8.0
e NaN
dtype: float64
Series类型的Name属性
Series对象和索引都可以有一个名字,存在属性.name中
b.name='Series对象'
b.index.name='索引列'
b
索引列
a 9
b 8
c 7
d 6
Name: Series对象, dtype: int64
Series对象可以随时修改并即刻生效
b['a']=15
b.name='Series'
b
索引列
a 15
b 8
c 7
d 6
Name: Series, dtype: int64
b.name='New series'
b['a','c']=20
b
索引列
a 20
b 8
c 20
d 6
Name: New series, dtype: int64
Pandas 库的DataFrame类型
Series是Pandas库中的一维数据类型
DataFrame是Pandas库中的二维数据类型,是由共用相同索引的一组列组成。即索引加多列数据构成。
DataFram类型的创建
从二维ndarray对象中创建
d = pd.DataFrame(np.arange(10).reshape(2,5))
d
|
0 |
1 |
2 |
3 |
4 |
0 |
0 |
1 |
2 |
3 |
4 |
1 |
5 |
6 |
7 |
8 |
9 |
从一维ndarray对象字典创建
dt={'one':pd.Series([1,2,3],index=['a','b','c']),
'two':pd.Series([9,8,7,6],index=['a','b','c','d'])}
d=pd.DataFrame(dt)
d
|
one |
two |
a |
1.0 |
9 |
b |
2.0 |
8 |
c |
3.0 |
7 |
d |
NaN |
6 |
pd.DataFrame(dt,index=['b','c','d'],columns=['two','three'])
|
two |
three |
b |
8 |
NaN |
c |
7 |
NaN |
d |
6 |
NaN |
从列表类型的字典创建
d1={'one':[1,2,3,4],'two':[9,8,7,6]}
d=pd.DataFrame(d1,index = ['a','b','c','d'])
d
|
one |
two |
a |
1 |
9 |
b |
2 |
8 |
c |
3 |
7 |
d |
4 |
6 |
d1={'城市':['北京','上海','广州','深圳','沈阳'],
'环比':[101.5,101.2,101.3,102.0,100.1],
'同比':[120.7,127.3,119.4,140.9,101.4],
'定基':[121.4,127.8,120.0,145.5,101.6]}
d=pd.DataFrame(d1,index=['c1','c2','c3','c4','c5'])
d
|
城市 |
环比 |
同比 |
定基 |
c1 |
北京 |
101.5 |
120.7 |
121.4 |
c2 |
上海 |
101.2 |
127.3 |
127.8 |
c3 |
广州 |
101.3 |
119.4 |
120.0 |
c4 |
深圳 |
102.0 |
140.9 |
145.5 |
c5 |
沈阳 |
100.1 |
101.4 |
101.6 |
d.index
Index(['c1', 'c2', 'c3', 'c4', 'c5'], dtype='object')
d.columns
Index(['城市', '环比', '同比', '定基'], dtype='object')
d.values
array([['北京', 101.5, 120.7, 121.4],
['上海', 101.2, 127.3, 127.8],
['广州', 101.3, 119.4, 120.0],
['深圳', 102.0, 140.9, 145.5],
['沈阳', 100.1, 101.4, 101.6]], dtype=object)
d['环比']
c1 101.5
c2 101.2
c3 101.3
c4 102.0
c5 100.1
Name: 环比, dtype: float64
d.ix['c2']
城市 上海
环比 101.2
同比 127.3
定基 127.8
Name: c2, dtype: object
d['同比']['c2']
127.3
Pandas库的数据类型操作
如何改变Series 和 DataFrame对象?
增加或重排:重新索引
方法: .reindex()能够改变或重排Series和DataFrame索引
c=d.reindex(index=['c5','c4','c3','c2','c1'])
c
|
城市 |
环比 |
同比 |
定基 |
c5 |
沈阳 |
100.1 |
101.4 |
101.6 |
c4 |
深圳 |
102.0 |
140.9 |
145.5 |
c3 |
广州 |
101.3 |
119.4 |
120.0 |
c2 |
上海 |
101.2 |
127.3 |
127.8 |
c1 |
北京 |
101.5 |
120.7 |
121.4 |
c=c.reindex(columns=['城市','同比','环比','定基'])
c
|
城市 |
同比 |
环比 |
定基 |
c5 |
沈阳 |
101.4 |
100.1 |
101.6 |
c4 |
深圳 |
140.9 |
102.0 |
145.5 |
c3 |
广州 |
119.4 |
101.3 |
120.0 |
c2 |
上海 |
127.3 |
101.2 |
127.8 |
c1 |
北京 |
120.7 |
101.5 |
121.4 |
删除:drop
.reindex(index=None,columns=None,…)的参数
newc = d.columns.insert(4,'新增')
newd = d.reindex(columns=newc,fill_value=200)
newd
|
城市 |
环比 |
同比 |
定基 |
新增 |
c1 |
北京 |
101.5 |
120.7 |
121.4 |
200 |
c2 |
上海 |
101.2 |
127.3 |
127.8 |
200 |
c3 |
广州 |
101.3 |
119.4 |
120.0 |
200 |
c4 |
深圳 |
102.0 |
140.9 |
145.5 |
200 |
c5 |
沈阳 |
100.1 |
101.4 |
101.6 |
200 |
d.index
Index(['c1', 'c2', 'c3', 'c4', 'c5'], dtype='object')
d.columns
Index(['城市', '环比', '同比', '定基'], dtype='object')
Series和DataFrame的索引是index类型
Index对象是不可修改的类型
索引类型的常用方法
c
|
城市 |
同比 |
环比 |
定基 |
c5 |
沈阳 |
101.4 |
100.1 |
101.6 |
c4 |
深圳 |
140.9 |
102.0 |
145.5 |
c3 |
广州 |
119.4 |
101.3 |
120.0 |
c2 |
上海 |
127.3 |
101.2 |
127.8 |
c1 |
北京 |
120.7 |
101.5 |
121.4 |
删除指定索引对象
.drop()能够删除Series和DataFrame指定行或列索引
a = pd.Series([9,8,7,6],index=['a','b','c','d'])
a
a 9
b 8
c 7
d 6
dtype: int64
a.drop(['b','c'])
a 9
d 6
dtype: int64
d
|
城市 |
环比 |
同比 |
定基 |
c1 |
北京 |
101.5 |
120.7 |
121.4 |
c2 |
上海 |
101.2 |
127.3 |
127.8 |
c3 |
广州 |
101.3 |
119.4 |
120.0 |
c4 |
深圳 |
102.0 |
140.9 |
145.5 |
c5 |
沈阳 |
100.1 |
101.4 |
101.6 |
d.drop('c5')
|
城市 |
环比 |
同比 |
定基 |
c1 |
北京 |
101.5 |
120.7 |
121.4 |
c2 |
上海 |
101.2 |
127.3 |
127.8 |
c3 |
广州 |
101.3 |
119.4 |
120.0 |
c4 |
深圳 |
102.0 |
140.9 |
145.5 |
d.drop('同比',axis=1)
|
城市 |
环比 |
定基 |
c1 |
北京 |
101.5 |
121.4 |
c2 |
上海 |
101.2 |
127.8 |
c3 |
广州 |
101.3 |
120.0 |
c4 |
深圳 |
102.0 |
145.5 |
c5 |
沈阳 |
100.1 |
101.6 |
Pandas库的数据类型运算
算术运算法则
算术运算根据行列索引,补齐后运算,运算默认产生浮点数。
补齐时缺项填充NaN(空值)
二维和一维、一维和零维间为广播运算
采用+ - * / 符号进行的二元运算产生新的对象
a = pd.DataFrame(np.arange(12).reshape(3,4))
a
|
0 |
1 |
2 |
3 |
0 |
0 |
1 |
2 |
3 |
1 |
4 |
5 |
6 |
7 |
2 |
8 |
9 |
10 |
11 |
b=pd.DataFrame(np.arange(20).reshape(4,5))
b
|
0 |
1 |
2 |
3 |
4 |
0 |
0 |
1 |
2 |
3 |
4 |
1 |
5 |
6 |
7 |
8 |
9 |
2 |
10 |
11 |
12 |
13 |
14 |
3 |
15 |
16 |
17 |
18 |
19 |
a+b
|
0 |
1 |
2 |
3 |
4 |
0 |
0.0 |
2.0 |
4.0 |
6.0 |
NaN |
1 |
9.0 |
11.0 |
13.0 |
15.0 |
NaN |
2 |
18.0 |
20.0 |
22.0 |
24.0 |
NaN |
3 |
NaN |
NaN |
NaN |
NaN |
NaN |
数据类型的算术运算的方法
b.add(a,fill_value=100)
|
0 |
1 |
2 |
3 |
4 |
0 |
0.0 |
2.0 |
4.0 |
6.0 |
104.0 |
1 |
9.0 |
11.0 |
13.0 |
15.0 |
109.0 |
2 |
18.0 |
20.0 |
22.0 |
24.0 |
114.0 |
3 |
115.0 |
116.0 |
117.0 |
118.0 |
119.0 |
a.mul(b,fill_value=0)
|
0 |
1 |
2 |
3 |
4 |
0 |
0.0 |
1.0 |
4.0 |
9.0 |
0.0 |
1 |
20.0 |
30.0 |
42.0 |
56.0 |
0.0 |
2 |
80.0 |
99.0 |
120.0 |
143.0 |
0.0 |
3 |
0.0 |
0.0 |
0.0 |
0.0 |
0.0 |
b= pd.DataFrame(np.arange(20).reshape(4,5))
b
|
0 |
1 |
2 |
3 |
4 |
0 |
0 |
1 |
2 |
3 |
4 |
1 |
5 |
6 |
7 |
8 |
9 |
2 |
10 |
11 |
12 |
13 |
14 |
3 |
15 |
16 |
17 |
18 |
19 |
c = pd.Series(np.arange(4))
c
0 0
1 1
2 2
3 3
dtype: int32
c- 10
0 -10
1 -9
2 -8
3 -7
dtype: int32
b-c
|
0 |
1 |
2 |
3 |
4 |
0 |
0.0 |
0.0 |
0.0 |
0.0 |
NaN |
1 |
5.0 |
5.0 |
5.0 |
5.0 |
NaN |
2 |
10.0 |
10.0 |
10.0 |
10.0 |
NaN |
3 |
15.0 |
15.0 |
15.0 |
15.0 |
NaN |
**不同维度间为广播运算,一维Series默认在轴1参与运算
要在零轴参与运算,需指定axis=0 **
b.sub(c,axis=0)
|
0 |
1 |
2 |
3 |
4 |
0 |
0 |
1 |
2 |
3 |
4 |
1 |
4 |
5 |
6 |
7 |
8 |
2 |
8 |
9 |
10 |
11 |
12 |
3 |
12 |
13 |
14 |
15 |
16 |
比较运算法则
比较运算只能比较相同索引的元素,不进行补齐。 (只能同维度运算,尺寸一致)
二维和一维、一维和零维间为广播运算。默认在1轴。
采用> < >= <= == != 等符号进行的二元运算产生布尔对象。
a = pd.DataFrame(np.arange(12).reshape(3,4))
a
|
0 |
1 |
2 |
3 |
0 |
0 |
1 |
2 |
3 |
1 |
4 |
5 |
6 |
7 |
2 |
8 |
9 |
10 |
11 |
d=pd.DataFrame(np.arange(12,0,-1).reshape(3,4))
d
|
0 |
1 |
2 |
3 |
0 |
12 |
11 |
10 |
9 |
1 |
8 |
7 |
6 |
5 |
2 |
4 |
3 |
2 |
1 |
a>d
|
0 |
1 |
2 |
3 |
0 |
False |
False |
False |
False |
1 |
False |
False |
False |
True |
2 |
True |
True |
True |
True |
a==d
|
0 |
1 |
2 |
3 |
0 |
False |
False |
False |
False |
1 |
False |
False |
True |
False |
2 |
False |
False |
False |
False |