zoukankan      html  css  js  c++  java
  • python数据分析之Pandas:汇总和计算描述统计

    pandas对象拥有一组常用的数学和统计方法,大部分都属于约简和汇总统计,用于从Series中提取单个的值,或者从DataFrame中的行或列中提取一个Series。相比Numpy而言,Numpy都是基于没有缺失数据的假设而构建的。

    来看一个简单的例子

    In [6]: df=DataFrame([[1.4,np.nan],[7,-4],[np.nan,np.nan],[0.75,-1.3]],index=['a

       ...: ','b','c','d'],columns=['one','two'])

    df中,有些行的数据是空的,没有实际意义

    In [7]: df

    Out[7]: 

        one  two

    a  1.40  NaN

    b  7.00 -4.0

    c   NaN  NaN

    d  0.75 -1.3

    但是在用sum计算的时候依然能够计算出每一列的值

    In [8]: df.sum()

    Out[8]: 

    one    9.15

    two   -5.30

    dtype: float64

    传入axis1会按照行的方式进行计算

    In [9]: df.sum(axis=1)

    Out[9]: 

    a    1.40

    b    3.00

    c    0.00

    d   -0.55

    dtype: float64

    约简方法的选项:

    间接统计(比如达到最小值和最大值的索引)

    In [10]: df.idxmax()

    Out[10]: 

    one    b

    two    d

    dtype: object

    In [11]: df.max()

    Out[11]: 

    one    7.0

    two   -1.3

    dtype: float64

    累加型:

    In [12]: df.cumsum()

    Out[12]: 

        one  two

    a  1.40  NaN

    b  8.40 -4.0

    c   NaN  NaN

    d  9.15 -5.3

    还有一种比较强大的方法describe用于一次性产生多个汇总统计。其中mean为平均值,std为标准差

    In [13]: df.describe()

    Out[13]: 

                one       two

    count  3.000000  2.000000

    mean   3.050000 -2.650000

    std    3.436204  1.909188

    min    0.750000 -4.000000

    25%    1.075000 -3.325000

    50%    1.400000 -2.650000

    75%    4.200000 -1.975000

    max    7.000000 -1.300000

    描述和汇总的方法:

    唯一值,值计数以及成员资格

    还有一类方法可以从一维Series的值中抽取信息。以下面这个Series为例

    In [15]: obj=Series(['c','a','d','a','a','b','d','c','c'])

    In [16]: uni=obj.unique()

    In [17]: uni

    Out[17]: array(['c', 'a', 'd', 'b'], dtype=object)

    返回的结果是未排序的,如果需要排序的话可以对uni采用sort的方法。

    In [18]: uni.sort()

    In [19]: uni

    Out[19]: array(['a', 'b', 'c', 'd'], dtype=object)

    value_counts统计Serises中各值出现的概率

    In [21]: obj.value_counts()

    Out[21]: 

    c    3

    a    3

    d    2

    b    1

    dtype: int64

    同样的得到的结果也是未排序的,如果要排序的话按照下面的方法进行

    In [22]: pd.value_counts(obj.values,sort=False)

    Out[22]: 

    a    3

    c    3

    b    1

    d    2

    dtype: int64

    那么这些功能也是可以针对DataFrame使用的,使用方法如下

    In [23]: data=DataFrame({'qu1':[1,3,4,3,4],'qu2':[2,3,1,2,3],'qu3':[1,5,2,4,4]})

        ...: 

    In [24]: data

    Out[24]: 

       qu1  qu2  qu3

    0    1    2    1

    1    3    3    5

    2    4    1    2

    3    3    2    4

    4    4    3    4

    pandasvalue_counts传给该DataFrameapply函数。

    In [25]: result=data.apply(pd.value_counts).fillna(0)

    得到的是

    In [26]: result

    Out[26]: 

       qu1  qu2  qu3

    1  1.0  1.0  1.0

    2  0.0  2.0  1.0

    3  2.0  2.0  0.0

    4  2.0  0.0  2.0

    5  0.0  0.0  1.0

    处理缺失数据

    pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据。NA的处理方法如下:

    In [27]: data=Series(['abc','antick',np.nan,'avocado'])

    In [28]: data.isnull()

    Out[28]: 

    0    False

    1    False

    2     True

    3    False

    dtype: bool

    In [29]: data.fillna('zero')

    Out[29]: 

    0        abc

    1     antick

    2       zero

    3    avocado

    dtype: object

    In [30]: data.notnull()

    Out[30]: 

    0     True

    1     True

    2    False

    3     True

    dtype: bool

    丢弃全为空的数据

    In [31]: data.dropna()

    Out[31]: 

    0        abc

    1     antick

    3    avocado

    dtype: object

    但在DataFrame中,如果直接采用dropna的话将会默认丢弃任何含有缺省值的行。

    In [32]: data=DataFrame([[1,6.5,3],[1,None,None],[None,None,None],[None,6.4,3]])

        ...: 

    In [33]: data

    Out[33]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  NaN  NaN

    2  NaN  NaN  NaN

    3  NaN  6.4  3.0

    In [34]: clean=data.dropna()

    In [35]: clean

    Out[35]: 

         0    1    2

    0  1.0  6.5  3.0

    传入how=’all’将只丢弃全为NA的那些行

    In [36]: clean=data.dropna(how='all')

    In [37]: clean

    Out[37]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  NaN  NaN

    3  NaN  6.4  3.0

    加入axis=1将会丢弃全为None的列

    In [38]: clean=data.dropna(axis=1,how='all')

    In [39]: clean

    Out[39]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  NaN  NaN

    2  NaN  NaN  NaN

    3  NaN  6.4  3.0

    填充缺失数据

    有些时候其实并不想要丢弃为空的数据,只是想换个显示名称或者通过其他方式来填补这些空洞。这个方法在前面其实也用过就是fillna

    In [40]: data.fillna(0)

    Out[40]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  0.0  0.0

    2  0.0  0.0  0.0

    3  0.0  6.4  3.0

    如果想差异化的填充,比如第一列的空数据填充0,第二列的空数据填充-1.fillna也是有方法的。传入一个字典即可

    In [41]: data

    Out[41]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  NaN  NaN

    2  NaN  NaN  NaN

    3  NaN  6.4  3.0

    字典的键值就代表列的索引,下面这个就是将第一列的空值填充为0,第二列的空值填充为-1

    In [42]: data.fillna({1:0,2:-1})

    Out[42]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  0.0 -1.0

    2  NaN  0.0 -1.0

    3  NaN  6.4  3.0

    再看下前向插值和后向插值。method=ffill是前向插值,也就是根据空值的前面的值进行插入

    In [43]: data.fillna(method='ffill')

    Out[43]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  6.5  3.0

    2  1.0  6.5  3.0

    3  1.0  6.4  3.0

    method=backfill为后向插值,也就是根据空值后面的值进行插入

    In [44]: data.fillna(method='backfill')

    Out[44]: 

         0    1    2

    0  1.0  6.5  3.0

    1  1.0  6.4  3.0

    2  NaN  6.4  3.0

    3  NaN  6.4  3.0

    fillna函数的参数

    层次化索引

    层次化索引是pandas的一个很重要的功能。它能使你在一个轴上拥有多个索引级别,也就是以低维度形式处理高维度的数据

    In [50]: data=Series(np.random.randn(10),index=[['a','a','a','b','b','b','c','c'

        ...: ,'d','d',],[1,2,3,1,2,3,1,2,1,2]])

    In [51]: data

    Out[51]: 

    a  1    1.085711

       2    0.018760

       3   -0.357718

    b  1    1.147850

       2   -0.065931

       3   -0.012061

    c  1   -0.736660

       2   -1.483384

    d  1   -0.403322

       2   -0.309897

    dtype: float64

    In [52]: data.index

    Out[52]: 

    MultiIndex(levels=[[u'a', u'b', u'c', u'd'], [1, 2, 3]],

               labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 0, 1]])

    在上面的这个例子中,a,b,c,d可以看做是外层索引。双层索引的使用

    In [53]: data['a']

    Out[53]: 

    1    1.085711

    2    0.018760

    3   -0.357718

    dtype: float64

    In [54]: data['a'][1]

    Out[54]: 1.0857109651061458

    In [55]: data['a'][2]

    Out[55]: 0.018760105407126977

    还可以在内层中提取数据

    In [58]: data[:,2]

    Out[58]: 

    a    0.018760

    b   -0.065931

    c   -1.483384

    d   -0.309897

    dtype: float64

    In [67]: data['a':'b']

    Out[67]: 

    a  1    1.085711

       2    0.018760

       3   -0.357718

    b  1    1.147850

       2   -0.065931

       3   -0.012061

    dtype: float64

    In [68]: data['a':'b'][2]

    Out[68]: -0.3577177301843591

    同样的对于DataFrame也可以进行类似的分层

    In [69]: frame=DataFrame(np.arange(12).reshape((4,3)),index=[['a','a','b','b'],[

        ...: 1,2,1,2]],columns=[['chengdu','chongqing','beijing'],['Green','Red','Gr

        ...: een']])

    In [70]: frame

    Out[70]: 

        chengdu chongqing beijing

          Green       Red   Green

    a 1       0         1       2

      2       3         4       5

    b 1       6         7       8

      2       9        10      11

    索引方式如下:

    In [73]: frame['chengdu']

    Out[73]: 

         Green

    a 1      0

      2      3

    b 1      6

      2      9

    In [74]: frame['chengdu']['Green']

    Out[74]: 

    a  1    0

       2    3

    b  1    6

       2    9

    Name: Green, dtype: int64

    In [75]: frame['chengdu']['Green']['a']

    Out[75]: 

    1    0

    2    3

    还可以给各层进行命名

    In [79]: frame.index.names=['key1','key2']

    In [80]: frame.columns.names=['city','color']

    In [81]: frame

    Out[81]: 

    city      chengdu chongqing beijing

    color       Green       Red   Green

    key1 key2                          

    a    1          0         1       2

         2          3         4       5

    b    1          6         7       8

         2          9        10      11

    根据级别汇总统计

    我们可以根据行或列上的级别来进行求和

    key2的列相同的值进行求和计算

    In [82]: frame.sum(level='key2')

    Out[82]: 

    city  chengdu chongqing beijing

    color   Green       Red   Green

    key2                           

    1           6         8      10

    2          12        14      16

    也就是akey2列等于1的值和bkey2列等于1的值求和。akey2列等于2的值和bkey2列等于2的值求和

    如果要针对ab分别求助,则采用level=key1的方式

    In [83]: frame.sum(level='key1')

    Out[83]: 

    city  chengdu chongqing beijing

    color   Green       Red   Green

    key1                           

    a           3         5       7

    b          15        17      19

    color相同的进行行求和。

    In [87]: frame.sum(level='color',axis=1)

    Out[87]: 

    color      Green  Red

    key1 key2            

    a    1         2    1

         2         8    4

    b    1        14    7

         2        20   10

  • 相关阅读:
    转 windows查看端口占用命令
    servlet 让浏览器输出中文,并成功打印出来.2种方法
    ctrl+shift+i eclipse快捷键,debug时显示全黑屏
    转 一台电脑安装多个tomcat
    如何从windows中拷贝文件到linux (ubuntu)??
    Eclipse Java注释模板设置简介,更改字体大小
    sikuli 如何 清空文本框中的内容??解决方法!
    servlet 中通过response下载文件
    servlet乱码 解决方法 2种方法
    关于JAVA路径 问题
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/8438891.html
Copyright © 2011-2022 走看看