pandas学习以及matplotlib绘图
pandas学习
一.简介pandas是一个强大的python数据分析的工具包,它是基于Numpy构建的,正因为pandas的出现,让python语言也成为使用最广泛且强大的数据分析环境之一
Pandas的主要功能:1.具备对其功能的数据结构DataFrame,Series2.集成时间序列功能3.提供丰富的数学运算和操作4.灵活处理确实数据
安装方法:pip install pandas引用方法:import pandas as pd
import pandas as pd;`
import numpy as np;
arr1 = np.array([1,2,3,4,5])
arr2 = np.array([5,4,3,2,1])
print(arr1*arr2)
[5 8 9 8 5]
二.SeriesSeries是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成.有点类似于python中的字典1.创建方法
## 第一种创建方法
s1 = pd.Series([1,2,3,4])
print(s1)
0 1
1 2
2 3
3 4
dtype: int64
print(s1[1])
2
将数组缩影以及数组的值打印出来,索引在左,值在右,由于没有为数据制定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引,取值的时候可以通过索引取值,跟之前学过的数组和列表一样
## 第二种
s2 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s2)
print(s2['a'])
a 1
b 2
c 3
d 4
e 5
dtype: int64
1
## 自定义索引,Index是一个索引列表,里面包含的是字符串,依然可以通过默认索引取值
print(s2[1])
2
### 第三种
s3 = pd.Series({"a":1,"b":2})
print(s3)
print(s3["a"])
## 指定索引
a 1
b 2
dtype: int64
1
### 第四种
s4 = pd.Series(0,index = ['a','b','c'])
print(s4)
a 0
b 0
c 0
dtype: int64
对于Series,其实我们可以认为它是一个长度固定且有序的字典,因为它的索引和数据是按照位置进行匹配的,类似于字典的key-value 形式
Series 确实数据1.dropna() 过滤掉值为NaN的行2.fill() 填充确实数据3.isnull() 返回bool数组,缺失值为true4.notnull() 返回bool数组,缺失值对应为false
### 第一步.创建一个字典,通过series方式创建一个Series对象
st = {"age":18,"name":"szp","gender":"male"}
obj = pd.Series(st)
print(obj)
print(obj['name'])
age 18
name szp
gender male
dtype: object
szp
### 第二步. 第一一个索引变量
a = {"age","name","gender","address"}
### 第三步
obj1 = pd.Series(st,index = a)
print(obj1) ## 将第二步定义的a变量座位索引传入
打印的结果:
gender male
address NaN
age 18
name szp
dtype: object
gender male
address NaN
age 18
name szp
dtype: object
## 因为 address没有出现在st的键中,所以返回的是缺失值
## 通过上面的代码演示,对于缺失值已经有了一个简单的了解,接下来就看看如何判断
## 缺失值
print(obj1) ## 先把这个兑现打印出来看看
gender male
address NaN
age 18
name szp
dtype: object
gender male
address NaN
age 18
name szp
dtype: object
obj1.isnull() ## 是缺失值返回true
## 运行结果
gender False
address True
age False
name False
dtype: bool
gender False
address True
age False
name False
dtype: bool
obj1.notnull() ### 是缺失值返回true
## 运行结果
gender True
address False
age True
name True
dtype: bool
gender True
address False
age True
name True
dtype: bool
## 过滤缺失值,布尔型索引
obj1[obj1.notnull()]
## 运行结果 将是Null的,缺失的数据剔除掉
gender male
age 18
name szp
dtype: object
gender male age 18 name szp dtype: object
Series 特性1.从ndarray 创建Series:Series(arr)2.与标量(数字)运算; sr * 2 3.两个Series 运算4.通用函数: np.ads(sr)5.布尔值过滤 sr[sr>0]6.统计函数 mean() sum() cunsum()
支持字典的特性: 1.从字典创建Series:Series(dic) 2.in 运算 成员运算 'a' in sr, for x in sr 3.键索引 4.键切片 print(obj1)
gender male address NaN age 18 name szp dtype: object print(obj1["gender":"age"]) gender male address NaN age 18 dtype: object 5.其他函数:get("a",default = 0)等
## 整数索引
## 接下来通过代码来演示pandas中的整数索引
sr = pd.Series(np.arange(10))
sr1 = sr[3:].copy()
print(sr1)
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int32
### 到这里会发现一切正常,一点问题都没有,可是当使用整数索引取值的时候就会发现出现问题了
### 因为在pandas 当中使用整数索引取值是有限以标签解释的,而不是下标
3 3 4 4 5 5 6 6 7 7 8 8 9 9 dtype: int32
print(sr1[3]) ## 这个不会出错,优先下标,打印出来的是3对应的3,而不是第4个
# print(sr1[1]) ### 但是这个会报错,因为sr1中没有一个1的Key
3
解决方法
loc属性 ## 以标签解释iloc 属性 ## 以下标解释
print(sr1.iloc[0]) ### 以下标解释
print(sr1.loc[3] ) ## 以标签解释
## 这两个输出结果都是一样的,都是3
3 3
Series 数据对齐
pandas 在运算时,会按索引进行对齐,然后再进行计算,如果存在不同的索引,则结果的索引是连个操作数索引的并集
sr1 = pd.Series([12,23,34],index = ["c","a","d"])
sr2 = pd.Series([11,20,10],index = ['d','c','a'])
sr1+sr2
运行结果
a 33
c 32
d 45
dtype: int64
## 可以通过这种索引对齐直接将两个Series对象进行运算
a 33
c 32
d 45
dtype: int64
sr3 = pd.Series([11,20,10,14],index = ['d','c','a','b'])
sr1 + sr3
## 运行结果
a 33.0
b NaN
c 32.0
d 45.0
dtype: float64
## sr1 和sr3的索引不一致,所以最终的运行会发现b缩影对应的值无法运算,就返回了
## NaN,一个缺失值
a 33.0 b NaN c 32.0 d 45.0 dtype: float64
## 将两个Series 对象相加时将缺失值设为 0
sr1 = pd.Series([12,23,34],index = ['a','b','c'])
sr3 = pd.Series([11,20,10,14],index = ['a','b','c','d'])
sr1.add(sr3,fill_value = 0)
运行结果:
a 23.0
b 43.0
c 44.0
d 14.0
dtype: float64
## 将缺失值设为 0 ,所以最后算出来d索引对应的值是14
a 23.0
b 43.0
c 44.0
d 14.0
dtype: float64
### 还有一些灵活的算术方法,add sub div mul 这里不一一介绍
DataFrame
DataFrame是一个表格型的数据结构,相当于是一个二维数组,含有一组有序的列,它可以被看做是由Series组成的字典,并且共用一个索引
创建方式:创建一个DataFrame数组可以有多种方式,其中最常用的方式就是利用包含等长度列表或者numpy数组的字典来形成DataFrame:
## 第一种
pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
## 产生的DataFrame 会自动为Series 分配索引,并且列会按照排序的顺序排列
## 运行结果
one two
0 1 4
1 2 3
2 3 2
3 4 1
<div><style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
</style><table border="1" class="dataframe"> <thead> <tr > <th></th> <th>one</th> <th>two</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>1</td> <td>4</td> </tr> <tr> <th>1</th> <td>2</td> <td>3</td> </tr> <tr> <th>2</th> <td>3</td> <td>2</td> </tr> <tr> <th>3</th> <td>4</td> <td>1</td> </tr> </tbody></table></div>
## 指定列
## 可以通过columns 参数指定顺序排列
data = pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
pd.DataFrame(data,columns=['one','two'])
运行结果
one two
0 1 4
1 2 3
2 3 2
3 4 1
## 打印结果会按照columns参数指定顺序
<div><style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
</style><table border="1" class="dataframe"> <thead> <tr > <th></th> <th>one</th> <th>two</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>1</td> <td>4</td> </tr> <tr> <th>1</th> <td>2</td> <td>3</td> </tr> <tr> <th>2</th> <td>3</td> <td>2</td> </tr> <tr> <th>3</th> <td>4</td> <td>1</td> </tr> </tbody></table></div>
## 第二种
pd.DataFrame({'one':pd.Series([1,2,3,4],index=['a','b','c','d']),
'two':pd.Series([6,7,8,9],index=['d','c','b','a'])})
##运行结果
one two
a 1 9
b 2 8
c 3 7
d 4 6
<div><style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
</style><table border="1" class="dataframe"> <thead> <tr > <th></th> <th>one</th> <th>two</th> </tr> </thead> <tbody> <tr> <th>a</th> <td>1</td> <td>9</td> </tr> <tr> <th>b</th> <td>2</td> <td>8</td> </tr> <tr> <th>c</th> <td>3</td> <td>7</td> </tr> <tr> <th>d</th> <td>4</td> <td>6</td> </tr> </tbody></table></div>
以上创建方式简单了解就可以,因为在实际应用中更多是读书节,不需要自己手动创建
查看数据常用属性和方法:index 获取行索引columns 获取列索引T: 转置values 获取值索引describe 获取快速统计
索引和切片
方法1: 两个中括号,先取列,再取行 df'A'方法2:(推荐) 使用loc/ iloc 属性,一个中括号,逗号隔开,先去行再取列, loc属性:解释为标签 iloc属性:解释为下标向DataFrame对象中写入值时只使用方法2列/行索引部分可以是常规索引,切片,布尔值索引,花式索引任意搭配,注意:两部分都是花式索引是结果可能和预料的不同
4.时间对象处理
时间序列类型时间戳:特定时刻固定时期:如2019年1月时间间隔:起始时间-结束时间
python库:datatimedate,time,datetime,timedelta
dt.strftime()strptime()灵活处理时间对象,dateutil包dateutil.parser.parse()
import time print(time.time)print(time.strftime())
5 数据分组和聚合
在数据分析当中,我们有时需要将数据拆分,然后再每一个特定的组里进行运算,这些操作通常也是数据分析工作中的重要环节5.1 分组 GroupBY机制
pandas对象,无论是Series,DataFrame还是其他什么的,当中的数据会根据提供的一个或者多个键被拆分为多组,拆分操作是在对象的特定轴上执行的,就比如DataFrame可以在他的行上或者列上进行分组,然后将一个函数应用到各个分组上并产生一个新的值,最后将所有的执行结果合并到最终的结果对象中
分组键的形式:列表或者数组,长度与待分组的轴一样表示DataFrame某个列名的值字典或者Series,给出待分组轴上的值或与分组名之间的对应关系函数,用于处理轴索引或者索引中国的各个标签码
具体介绍可以见:https://www.cnblogs.com/xiaoyuanqujing/articles/11646477.html
读取excel 表格或者CSV文件数据
https://www.cnblogs.com/happymeng/p/10481293.html
可以在jupyter notebook 中直接直接操作excel文件,做数据的分析工作,具体的介绍方法在可以看上面的那个链接
也可以直接去博客园搜索相关的pandas 操作excel文件的案例
matplolib
这个模块是用来画图的,可以将一些数据画成各种图形,还可以绘制三维图
但是我们一般用Echarts绘图.这个绘制的图像更加的美观,
https://www.echartsjs.com/examples/zh/index.html#chart-type-globe
还有highcharts
https://www.highcharts.com.cn/demo/highmaps
这两个生成的图片会更加的美观,而且简单