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

这两个生成的图片会更加的美观,而且简单

posted @ 2019-11-26 22:09  同济小孙  阅读(951)  评论(0编辑  收藏  举报