美文网首页
[python][科学计算][pandas]简要使用教程3-数组

[python][科学计算][pandas]简要使用教程3-数组

作者: jiedawang | 来源:发表于2019-03-18 13:19 被阅读0次

    最后一次更新日期: 2019/3/21

    pandas是基于numpy的数据分析库,提供一些更易用的数据模型和大量高效的统计方法。

    使用前先导入模块:
    import pandas as pd
    按需导入以下模块:
    import numpy as np
    import matplotlib.pyplot as plt

    1. 运算符和标量值函数

    pandas重载了python的大部分运算符,可以直接进行数组计算,numpy的标量值函数也可直接使用,这些运算都是将原本作用于单个元素的运算拓展到整个数组。

    In [56]: df=pd.DataFrame([[1,'2'],[3,'a']],columns=['col1','col2'])
    
    In [57]: df+df
    Out[57]: 
       col1 col2
    0     2   22
    1     6   aa
    
    In [201]: np.sqrt(df.col1)
    Out[201]: 
    0    1.000000
    1    1.732051
    Name: col1, dtype: float64
    

    使用的运算符和函数必须对参与运算的所有数据类型都是有意义的,否则会报错。

    匹配方式
    In [154]: s1=pd.Series([1,2,3,4],index=[0,1,2,3])
    
    In [155]: s2=pd.Series([5,6,7,8],index=[1,2,3,4])
    
    In [156]: s1+s2
    Out[156]: 
    0     NaN
    1     7.0
    2     9.0
    3    11.0
    4     NaN
    dtype: float64
    

    此处需要注意pandas和numpy的区别,pandas的数组运算在元素匹配上是基于标签索引的,未能匹配到的位置会被替换为NaN,numpy则是基于位置索引。

    2. 统计方法

    聚合函数

    pandas继承了numpy的聚合函数:summeanmaxmin等。
    可通过SeriesDataFrame的方法调用,或是调用numpy下的静态方法。

    In [58]: df.sum()
    Out[58]: 
    col1     4
    col2    2a
    dtype: object
    
    In [60]: np.max(df)
    Out[60]: 
    col1    3
    col2    a
    dtype: object
    
    In [114]: df.agg({'col1':'max','col2':'sum'})
    Out[114]: 
    col1     3
    col2    2a
    dtype: object
    
    In [115]: df.agg(['max','sum'])
    Out[115]: 
         col1 col2
    max     3    a
    sum     4   2a
    

    通过pandas数据模型的方法调用时,
    第一个参数axis可以指定统计的轴,Series指定该参数没有意义,DataFrame默认沿轴0统计,即按列统计。pandas无法指定对所有轴展开统计,如有需要可以使用numpy的方法;
    第二个参数skipna可以指示是否跳过NaN值;
    第三个参数level用于在存在多级索引的情况下指定某一级索引进行统计;
    第四个参数numeric_only用于指定是否只对数字应用计算。

    当对DataFrame沿行方向统计时,由于不同列的数据类型可能不一样,需保证对应运算是有意义的,否则无法得到期望的结果。

    agg方法是aggregate方法的简写,用于对不同列应用不同聚合函数或是多种聚合函数,可以传入list或是dict声明统计方式。

    分组统计

    pandas提供了类似于sql的groupby方法用于分组统计。

    In [88]: df=pd.DataFrame([['a','c',1],['a','d',2],['b','d',3]],columns=['col1','col2','col3'])
    
    In [89]: df
    Out[89]: 
      col1 col2  col3
    0    a    c     1
    1    a    d     2
    2    b    d     3
    
    In [93]: result=df.groupby(by=['col1','col2']).agg(['max','min'])
    
    In [94]: result
    Out[94]: 
              col3    
               max min
    col1 col2         
    a    c       1   1
         d       2   2
    b    d       3   3
    
    In [95]: result.sum(level=0)
    Out[95]: 
         col3    
          max min
    col1         
    a       3   3
    b       3   3
    
    In [140]: gb=df.groupby(by=['col1','col2'])
    
    In [141]: gb.groups
    Out[141]: 
    {('a', 'c'): Int64Index([0], dtype='int64'),
     ('a', 'd'): Int64Index([1], dtype='int64'),
     ('b', 'd'): Int64Index([2], dtype='int64')}
    
    In [142]: gb.get_group(('a','c'))
    Out[142]: 
      col1 col2  col3
    0    a    c     1
    

    只调用groupby方法会得到一个DataFrameGroupBy对象,通过其groups方法可查看所有分组信息,get_group方法可获取指定分组。
    该对象可调用各种聚合函数,或调用agg方法进行复合的聚合统计,返回包含多级索引的DataFrame统计结果表,对于结果表,可以继续应用统计函数并通过level参数指定索引级别进行二次统计。

    3. 应用自定义函数

    除pandas和numpy提供的函数外,还可以自定义函数并使用applyapplymapmap方法快速应用于整个数据集。

    In [119]: df.apply(lambda x: x.col1+x.col2, axis=1)
    Out[119]: 
    0    3
    1    7
    dtype: int64
    
    In [120]: def add(row):
         ...:     return row.col1+row.col2
    
    In [121]: df.apply(add, axis=1)
    Out[121]: 
    0    3
    1    7
    dtype: int64
    
    In [122]: df.applymap(lambda x: x*2)
    Out[122]: 
       col1  col2
    0     2     4
    1     6     8
    
    In [123]: def double(item):
         ...:     return item*2
    
    In [124]: df.applymap(double)
    Out[124]: 
       col1  col2
    0     2     4
    1     6     8
    
    In [128]: s=pd.Series(['a','b','b'])
    
    In [129]: s.map(lambda x: x*2)
    Out[129]: 
    0    aa
    1    bb
    2    bb
    dtype: object
    
    In [130]: s.map({'a':'c','b':'d'})
    Out[130]: 
    0    c
    1    d
    2    d
    dtype: object
    

    DataFrameapplyapplymap两个方法:
    apply将函数应用于每行或者每列,axis参数指定应用函数的轴方向,值为0表示按列应用,即逐列作为函数的参数进行计算,值为1表示按行应用,默认为0;
    applymap将函数应用于每个元素。

    Series只有一个map方法,用于将函数应用于元素,除此以外,还提供值映射的功能,输入dict类型时会根据key-value映射将相应的值替换。

    支持lambda匿名函数。

    4. 广播

    In [80]: l2=[1,2]
        ...: a2=np.array(l2)
        ...: s2=pd.Series(l2)
        ...: df21=pd.DataFrame([1,2])
        ...: df12=pd.DataFrame([[1,2]])
        ...: l22=[[1,2],[3,4]]
        ...: a22=np.array(l22)
        ...: df22=pd.DataFrame(l22)
        ...: df23=pd.DataFrame([[3,4,5],[6,7,8]])
    
    In [99]: df22+l2
    Out[99]: 
       0  1
    0  2  4
    1  4  6
    
    In [100]: df22+a2
    Out[100]: 
       0  1
    0  2  4
    1  4  6
    
    In [101]: df22+s2
    Out[101]: 
       0  1
    0  2  4
    1  4  6
    
    In [102]: df22+df21
    Out[102]: 
       0   1
    0  2 NaN
    1  5 NaN
    
    In [103]: df22+df12
    Out[103]: 
         0    1
    0  2.0  4.0
    1  NaN  NaN
    
    In [104]: df23+s2
    Out[104]: 
         0    1   2
    0  4.0  6.0 NaN
    1  7.0  9.0 NaN
    
    In [130]: df21+df12
    Out[130]: 
         0   1
    0  2.0 NaN
    1  NaN NaN
    

    pandas的广播机制继承自numpy但有不一样的地方:
    标量值会与DataFrameSeries中每个元素进行同样的计算;
    Series或一维list或一维ndarray会与DataFrame的每一行进行运算,Series在长度不足以匹配DataFrame的行时不足部分会替换为NaN,其他两种长度不足会报错;
    DataFrameDataFrame进行运算会按元素匹配,无论行列,长度不足的部分都会替换为NaN
    二维ndarrayDataFrame的运算遵循numpy的广播规则,长度不足且为1的轴会被广播至同等大小;
    二维listDataFrame的运算不被支持。

    相关文章

      网友评论

          本文标题:[python][科学计算][pandas]简要使用教程3-数组

          本文链接:https://www.haomeiwen.com/subject/kryvmqtx.html