Python数据分析-Pandas

Posted cecilia-2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析-Pandas相关的知识,希望对你有一定的参考价值。

在学习了Numpy后,进行数据科学计算,为何还要使用Pandas呢?其实原因就是效率高,那为何Pandas效率比numpy要高呢?其实Pandas和Numpy还是有着很大的关系的,Pandas本身是依赖numpy的,而ndarray在内存里占据这一段连续的内存空间,任何改变ndarray长度的操作都势必让所有value改变内存中的位置因此在某种程度上,Numpy操作效率还是比较慢的。但是Pandas并不是处理所有的数据都是效率很高的,那么一般情况下处理以下的数据比较友好:

Pandas适合处理多种类型的数据:

  • 具有不同数据类型列的表格数据(DataFrame),如SQL表或Excel电子表格。
  • 有序或无序(不固定频率)的时间序列数据。
  • 带有行和列标签的任意矩阵数据。
  • 任何其他形式的观测/统计数据集。
  • Pandas主要包含三种数据结构,分别是Series(一维),DataFrame(二维),Panel(三维)。其中Series和DataFrame可以用于处理绝大多数金融,统计,社会科学和许多工程领域的典型问题。
    Pandas库是统计科学家在分析数据时的理想工具,非常适合应用于数据清洗,分析/建模然后将分析结果组织成适合于绘图或表格显示的形式的全部过程。那么其中的优势在哪呢?

优势

  • 可以轻易地处理浮点以及非浮点类型的数据的缺失值
  • 大小可变:DataFrame和Panel都可以删除和插入
  • 灵活强大的分组功能,可对数据集进行拆分组合
  • 切片操作,便于索引,存取数据

数据结构

  • Series:类似于一维数组的对象,由一组数据以及一组相关的数据标签组成的数据结构。可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。

    • 创建Series方法——pd.Series
    • 获取数组表示形式——obj.values
    • 获取索引对象——obj.index

      eg:
      # 第一种创建series的方式:
          s1 = pd.Series([1,2,3,4,5,6,7,8,9])
          print(s1)
          print(s1.values)    # series的值
          print(s1.index)  # 索引信息
      
      # 第二种创建series方式:
          s2 = pd.Series(np.arange(10))
          print(s2)
      
      #  第三种通过字典的方式创建series:
          s3 = pd.Series("cecilia":90,'cc':89,'abc':97)
          print(s3)
          print(s3.index)
          s4 = pd.Series(s1.to_dict()) # 转字典
          print(s4)
          s5 = pd.isnull(s3)
          s5.index.name = "name score" # 给列名添加名称
          print(s5)
    • 通过索引存取元素

      >>>obj2 = pd.Series([4, 7,-5,3], index=['d','b','a','c']) #还能自定义index进行创建Series
      >>>obj2
      d    4
      b    7
      a   -5
      c    3
      dtype: int64
      >>> obj2.index
      Index([u'd', u'b', u'a', u'c'], dtype='object')
      
      ## 通过索引存取元素和修改元素值
      >>>obj2['d']= 6 # 修改index='d'的索引值
      d    6
      b    7
      a   -5
      c    3
      dtype: int64
      >>>obj2[['c','a','d']]  ## 选取index='c' 'a' 'd'的元素值
      c    3
      a   -5
      d    6
      dtype: int64
      
      ## 按照索引条件获取元素
      >>>obj2[obj2>0]
      d    6
      b    7
      c    3
      dtype: int64
    • 检测缺失数据——pd.innull和pd.notnull
  • DataFrame:是一个table型数据,包含一组有序的列,每列可以是不同的值类型,DataFrame既有行索引也有列索引,可以看作是由Series组成的字典。dataFrame中的数据是以一个或者多个二维块存放的,而不是列表、字典等。

    • 创建DataFrame

      eg:
      >>> data = 'a':[1,2,3],
             'b':[4,5,6],
             'c':[7,8,9]
      >>> df = pd.DataFrame(data)
      >>> print(df)
         a  b  c
      0  1  4  7
      1  2  5  8
      2  3  6  9
      注意:结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序悱列!!!
      
      ## 如果指定了列序列,则DataFrame的列就会按照指定顺序迸行排列,如果指定的列不存在,那么结果是一个空的dataframe
      >>>pd.DataFrame(data, columns=['b', 'a', 'c'])
         b  a  c
      0  4  1  7
      1  5  2  8
      2  6  3  9
    • 存取元素(其实是一个Series)

      注意:

      • 返冋的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置 好了。行也可以通过位置或名称的方式进行获取。
      • 如果采用非整数切片的方式进行选取数据,那么末端的索引对应的数据是包含在内的,而整数切片索引,其末端的索引对应的数据是“含前不含后”。
      ## 通过字典标记或者属性来获取Series
      >>> data = 'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
            'year':[2000, 2001, 2002, 2001, 2002],
            'pop':[1.5, 1.7, 3.6, 2.4, 2.9]
      >>> df= pd.DataFrame(data, columns=['year', 'state', 'pop'])
      >>> print(df['state'])
      0      Ohio
      1      Ohio
      2      Ohio
      3    Nevada
      4    Nevada
      Name: state, dtype: object
      • ix、loc、iloc

        • ix——可以通过行号索引,也可以通过行标签索引(从pandas 0.20.0版本开始,官方不推荐使用.ix方法,而是使用.iloc 和.loc方法)

        • loc——loc[‘d’]表示索引的是第’d’行(index 是字符)通过行标签索引行数据,也可以索引某行某列

        • iloc——通过行号获取行数据或者多行数据,但是通过行标签获取会报错

          ## 承接上面的df
          >> print(df.loc[1]) # 选取第一行的数据
          state    Ohio
          year     2001
          pop       1.7
          Name: 1, dtype: object
          >> print(df.loc[0:2]) # 选取index=0到index=2行的数据,总共三行数据
            state  year  pop
          0  Ohio  2000  1.5
          1  Ohio  2001  1.7
          2  Ohio  2002  3.6
          ## 可以锁定行,按照特征属性多列选取元素
          >> num_cols = ['RT_user_norm', 'Metacritic_user_nom', 'IMDB_norm', 'Fandango_Ratingvalue', 'Fandango_Stars']
          >> bar_heights = norm_data.loc[0, num_cols].values
          >> print(bar_heights)
          [4.3 3.55 3.9 4.5 5.0]
          
          ## 重置索引index,通过行号获取数据
          >> df.reset_index(inplace=True)
          >> df.head()
          >> print(df.iloc[2:4]) # 获取第2行、第3行数据
             index   state  year  pop
          2      2    Ohio  2002  3.6
          3      3  Nevada  2001  2.4
    • 重建索引——reindex()函数:将会根据新索引进行重排。如果某个索引值当前不存在,就引入缺失值,可以采用填充的方式处理缺失值

      • 有几种参数:

        参数           说明
        index        用作索引的新序列。既可以是index实例,也
                       可以是其他序列型的Python数据结构。Index
                       会被完全使用,就像没有任何复制一样。
        method     插值(填充)方式。
        fill_value  在重新索引的过程中,需要引入缺失值时使用
                       的替代值 .   
        limit        前向或后向填充时的最大填充量.
        level        在Multiindex的指定级别上匹配简单索引,否
                        则选取其子集
        copy           默认为True,无论如何都复制;如果为False,
                       则新旧相等就不复制
        
        其中method方法的参数如下:
        参数                     说明
        ffill或pad         前向填充(或搬运)值
        bfill或backfill        后向填充(或搬运)值
      • fill_value=0,直接填充0

    • 删除任意轴上的索引值——drop(index,axis=1/0)
    • apply函数——将函数应用到由各列或行所形成的一维数组上,比如sum和mean等

      eg:
      # 将求最大值和最小值之间的差得函数运用在某一轴上
      >>>f = lambda x: x.max() - x.min()
      >>>frame.apply(f)
      >>>frame.apply(f, axis=1)
      
    • 排名和排序

      • sort_index——对行或列索引进行排序 (按字典顺序)
      • order——针对按照值Series排序
      • rank——排名,默认情况下,rank是通过“为各组分配一个平均排名”的方式破坏平级关系的
      eg:
      >>>frame = DataFrame(np.arange(8).reshape((2, 4)), 
          index=['three', 'one'], columns=['d','a','b','c'])
      
      >>>frame.sort_index()
      
      >>>frame.sort_index(axis=1)
      
      ## 默认的是升序排列,但也可以降序排列
      >>>frame.sort_index(axis=1, ascending=False)
      
      ## 根据一个或多个列觉得值进行排序,采用**by选项**
      >>>frame.sort_index(by=['three', 'one'])
      
      
      ## 如要按照值对Series 进行排序,那么可以order
      >>>obj = Series([4, 7, -3, 2])
      >>>obj.order()
      2   -3
      3    2
      0    4
      1    7
      >>>obj = Series([4, np.nan, 1, np.nan, -3, 2])
      >>>obj.order() #在排序时,缺失值默认都会被放到Series的末尾.
      4    -3
      2     1
      5     2
      0     4
      1   NaN
      NaN
      

      注意:排名(Series.rank(method=‘average‘,ascending=True))的作用与排序的不同之处在于,他会把对象的values替换成名次(从1 到 n)。这时唯一的问题在于如何处理平级项,方法里的 method 参数就是起这个作用的,他有四个值可选:average,min, max, first。

    • is_unique——属性验证是否是唯一的
  • 汇总与统计

    • sum(axis=1/0)——axis=1按照行求和
    • mean(axis=1, skipna=False)——skipna选项可以避免行列存在NA得值进行计算
    • idxmin和idxmax,达到最小值或最大值的索引
    • describe——用于一次性汇总统计

处理缺失数据得方式

  • 去除

  • 填充

技术图片

以上是关于Python数据分析-Pandas的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析之pandas学习

python 数据分析--pandas

Pandas基础

小白学 Python 数据分析(11):Pandas 数据分组

小白学 Python 数据分析(10):Pandas 数据运算

基于 Python 和 Pandas 的数据分析 --- Pandas 基础