博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

二、Python开发---33、pandas(1)

Posted on 2020-03-01 21:26  兰智杰  阅读(274)  评论(0编辑  收藏  举报

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中主要有两种数据结构,分别是:SeriesDataFrame

  (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中的isnullnotnul这两个函数可以用在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
'''