pandas
pandas是一种Python数据分析的利器,是一个开源的数据分析包,最初是应用于金融数据分析工具而开发出来的,因此pandas为时间序列分析提供了很好的支持,pandas是PyData项目的一部分,它主要提供了五大功能:
-
支持文件存取操作,支持数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等
-
支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换
-
支持多表拼接合并操作
-
支持简单的绘图操作
-
支持简单的统计分析操作
官网:http://pandas.pydata.org/
官方文档:http://pandas.pydata.org/pandas-docs/stable/
pandas引入约定——from pandas import Series, DataFrame
import pandas as pd
pandas中主要有两种数据结构,分别是:Series和DataFrame
(1)Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成,仅由一组数据也可产生简单的Series对象,注意:Series中的索引值是可以重复的
(2)DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame既有行索引也有列索引,可以被看做是由Series组成的字典
Series的创建
1、通过一维数组创建
Series属性——常见属性有values(获取值)、index(获得索引值)、dtype(获得类型)
''' 输出为 0 1 1 2 2 3 3 4 4 5 dtype: int64 ''' import pandas as pd ser01 = pd.Series([1,2,3,4,5]) print(ser01) print('值',ser01.values) #输出为 值 [1 2 3 4 5] print('索引值',ser01.index) #输出为 索引值 RangeIndex(start=0, stop=5, step=1) print('类型',ser01.dtype) #输出为 类型 int64
2、通过ndarray创建,利用series创建一个二维数组,因为series只能直接创建一维数组,如果要创建二维数组,必须导入numpy模块,利用np.array(多维数组)
''' 输出为 0 [1, 2, 3, 4] 1 [1, 2, 3, 4, 5] dtype: object ''' import pandas as pd import numpy as np ser02=pd.Series(np.array([[1,2,3,4],[1,2,3,4,5]])) # 表示将numpy里array创建多维数组的方法,嵌套到series里,创建多维数组 print(ser02) print('值',ser02.values) #输出为 值 [list([1, 2, 3, 4]) list([1, 2, 3, 4, 5])] print('索引值',ser02.index) #输出为 索引值 RangeIndex(start=0, stop=2, step=1) print('类型',ser02.dtype) #输出为 类型 object
修改索引(index)和数据类型(dtype)
import pandas as pd import numpy as np ser03=pd.Series([100,22,99,66]) ser03.index=['数学','英语','语文','综合'] print(ser03) ''' 输出为 数学 100 英语 22 语文 99 综合 66 dtype: int64 ''' #另一种写法 ser04=pd.Series(data=[100,22,99,66],dtype=np.float,index=['数学','英语','语文','综合']) print(ser04) ''' 输出为 数学 100.0 英语 22.0 语文 99.0 综合 66.0 dtype: float64 '''
3、通过字典方式创建series多维数组
#通过字典方式创建series多维数组 import pandas as pd import numpy as np dict01=({'1001':'张三','1002':'李四','1003':'王麻子'}) #字典存放键值对-通过key取值 ser06=pd.Series(dict01) #将字典数据传到series中,形成矩阵 print(ser06) ''' 输出为 1001 张三 1002 李四 1003 王麻子 dtype: object ''' print('字典创建的值:',ser06.values) #输出为 字典创建的值: ['张三' '李四' '王麻子'] print('字典创建的索引:',ser06.index) #输出为 字典创建的索引: Index(['1001', '1002', '1003'], dtype='object')
Series值的获取
Series值的获取主要有两种方式:
1、通过方括号+索引的方式读取对应索引的数据,有可能返回多条数据
2、通过方括号+下标值的方式读取对应下标值的数据,下标值的取值范围为:(0,len(Series.values));另外下标值也可以是负数,表示从右往左获取数据
series获取多个值的方法类似numpy的bdarray切片操作,通过方括号+下标值/索引值+冒号(:)的形式获取series对象的一部分数据
切片的两种操作:
1、print(ser01[0:2])—通过下标值
2、print(ser01[‘a’:‘c’])–通过索引值
import pandas as pd #方括号+下标值 ser07=pd.Series(['A','B','C','D']) print(ser07[0]) #输出为 A #方括号+索引 ser08=pd.Series(['A','B','C','D']) ser08.index=(['a','b','c','d']) print(ser08['a']) #输出为 A #通过numpy的ndarray的切片机制 ser09=pd.Series(['A','B','C','D']) ser09.index=(['a','b','c','d']) #通过下标值 print(ser09[0:2]) #不包含终点 ''' 输出为 a A b B dtype: object ''' #通过索引值 print(ser09['a':'c']) #包含终点 ''' 输出为 a A b B c C dtype: object '''
Series的运算
NumPy中的数组运算,在Series中都保留了,均可以使用,并且Series进行数组运算的时候,索引与值之间的映射关系不会发生改变,注意:其实在操作Series的时候,基本上可以把Series看成NumPy中的ndarray数组来进行操作,ndarray数组的绝大多数操作都可以应用到Series上
import pandas as pd import numpy as np ser=pd.Series({ '201612348':1000, '201612347':999, '201612346':666, '201612345':555 }) print(ser) ''' 输出为 201612348 1000 201612347 999 201612346 666 201612345 555 dtype: int64 ''' print(ser[ser>666]) ''' 输出为 201612348 1000 201612347 999 dtype: int64 ''' print(ser/10) ''' 输出为 201612348 100.0 201612347 99.9 201612346 66.6 201612345 55.5 dtype: float64 ''' print(ser+1) ''' 输出为 201612348 1001 201612347 1000 201612346 667 201612345 556 dtype: int64 ''' ser01=pd.Series([-1,-2,-3,-4]) print(ser01) ''' 输出为 0 -1 1 -2 2 -3 3 -4 dtype: int64 ''' print(np.exp(ser01)) ''' 输出为 0 0.367879 1 0.135335 2 0.049787 3 0.018316 dtype: float64 ''' print(np.fabs(ser01)) ''' 输出为 0 1.0 1 2.0 2 3.0 3 4.0 dtype: float64 '''
Series缺失值检测
1、什么是缺失值?没有被赋值
2、确实和不赋值的区别:
不赋值——空指针异常
缺失——程序不会报空指针异常,也不会报程序异常,会用NaN填充
3、pandas中的isnull和notnul这两个函数可以用在Series中检查缺失值,这两个函数返回的是一个布尔类型的Series
isnull——表示字典里有缺失值的判断,有缺失值返回true反之false(返回的是bool类型)
notnull——表示字典里有缺失值的判断,有缺失值返回false反之true(返回的是bool类型)
#缺失值检测 import pandas as pd import numpy as np ser16=pd.Series({'1001':'a','1002':'b','1003':'c'}) print(ser16) ''' 输出为 1001 a 1002 b 1003 c dtype: object ''' ser17=pd.Series(ser16,index=['1001','1002','1008']) print(ser17) ''' 输出为 1001 a 1002 b 1008 NaN dtype: object ''' #isnull print(pd.isnull(ser17)) ''' 输出为 1001 False 1002 False 1008 True dtype: bool ''' #notnull print(pd.notnull(ser17)) ''' 输出为 1001 True 1002 True 1008 False dtype: bool '''
Series自动对齐
当多个series对象之间进行运算的时候,如果不同series之间具有不同的索引值,那么运算会自动对齐不同索引值的数据,如果某个series没有某个索引值,那么最终结果会赋值为NaN
自动对齐是基于一个列表元素或者多维数据的矩阵/矩阵乘积
原理:通过Series自动匹配index所对应的值,有匹配的值和index,按照原数据打印数据,如果对应位置没有index值,那么用NAN填充
# 顺序不同 import pandas as pd ser18=pd.Series([1,2,3,4],index=['a','b','c','d']) print(ser18) ''' 输出为 a 1 b 2 c 3 d 4 dtype: int64 ''' ser19=pd.Series([10,20,30,40],index=['d','c','b','a']) print(ser18+ser19) ''' 输出为 a 41 b 32 c 23 d 14 dtype: int64 ''' # 没有某个索引值 ser20=pd.Series([1,2,3,4],index=['a','b','c','d']) print(ser20) ''' 输出为 a 1 b 2 c 3 d 4 dtype: int64 ''' ser21=pd.Series([10,20,30,40],index=['d','c','b','f']) print(ser20+ser21) ''' 输出为 a NaN b 32.0 c 23.0 d 14.0 f NaN dtype: float64 '''
Series及其索引的name属性
Series对象本身以及索引都具有一个name属性,默认为空,根据需要可以进行赋值操作
# series的name属性 import pandas as pd ser22=pd.Series({'1001':'a','1002':'b','1003':'c'}) ser22.name='字母' ser22.index.name='小写字母' print(ser22) ''' 输出为 小写字母 1001 a 1002 b 1003 c Name: 字母, dtype: object '''