zoukankan      html  css  js  c++  java
  • pandas层级索引和统计计算

    层级索引(hierarchical indexing)

    下面创建一个Series, 在输入索引Index时,输入了由两个子list组成的list,第一个子list是外层索引,第二个list是内层索引。

    import pandas as pd
    import numpy as np
    
    ser_obj = pd.Series(np.random.randn(12), index=[
        ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
        [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
    ])
    print(ser_obj)

    效果

    a  0    0.148659
       1    0.392730
       2   -0.410365
    b  0   -1.441815
       1   -1.085728
       2   -1.755635
    c  0    0.548349
       1    0.186693
       2    0.355762
    d  0   -0.055593
       1    0.180773
       2    0.532658
    dtype: float64

    MultiIndex索引对象

    • 打印这个Series的索引类型,显示是MultiIndex

    • 直接将索引打印出来,可以看到有lavels,和labels两个信息。lavels表示两个层级中分别有那些标签,labels是每个位置分别是什么标签。

    import pandas as pd
    import numpy as np
    
    ser_obj = pd.Series(np.random.randn(12), index=[
        ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
        [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
    ])
    # print(ser_obj)
    print(type(ser_obj.index))
    print(ser_obj.index)

    效果:

    <class 'pandas.core.indexes.multi.MultiIndex'>
    MultiIndex([('a', 0),
                ('a', 1),
                ('a', 2),
                ('b', 0),
                ('b', 1),
                ('b', 2),
                ('c', 0),
                ('c', 1),
                ('c', 2),
                ('d', 0),
                ('d', 1),
                ('d', 2)],
               )

    选取子集

    • 根据索引获取数据。因为现在有两层索引,当通过外层索引获取数据的时候,可以直接利用外层索引的标签来获取。

    • 当要通过内层索引获取数据的时候,在list中传入两个元素,前者是表示要选取的外层索引,后者表示要选取的内层索引。

    1. 外层选取:

    ser_obj['outer_label']

    import pandas as pd
    import numpy as np
    
    ser_obj = pd.Series(np.random.randn(12), index=[
        ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
        [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
    ])
    
    # 外层选取
    print(ser_obj['c'])

    效果

    0    0.072428
    1    1.194215
    2   -1.456029
    dtype: float64

    2. 内层选取:

    ser_obj[:, 'inner_label']

    import pandas as pd
    import numpy as np
    
    ser_obj = pd.Series(np.random.randn(12), index=[
        ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
        [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
    ])
    
    # 内层选取
    print(ser_obj[:, 2])

    效果

    a   -0.098249
    b    1.807483
    c   -0.294296
    d    0.243345
    dtype: float64

    常用于分组操作、透视表的生成等

    交换分层顺序

    1. swaplevel()

    .swaplevel( )交换内层与外层索引。

    import pandas as pd
    import numpy as np
    
    ser_obj = pd.Series(np.random.randn(12), index=[
        ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
        [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
    ])
    
    print(ser_obj.swaplevel())

    效果

    0  a   -0.475376
    1  a    0.012922
    2  a    0.130198
    0  b    0.119821
    1  b   -0.315828
    2  b    0.033378
    0  c   -0.156276
    1  c   -0.496511
    2  c   -1.493716
    0  d   -0.453016
    1  d   -0.556026
    2  d    0.380415
    dtype: float64

    交换并排序分层

    swaplevel()

    .sort_index( )先对外层索引进行排序,再对内层索引进行排序,默认是升序。

    import pandas as pd
    import numpy as np
    
    ser_obj = pd.Series(np.random.randn(12), index=[
        ['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
        [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
    ])
    print(ser_obj)
    # 交换并排序分层
    print(ser_obj.swaplevel().sort_index())

    效果:

    a  0    1.118216
       1   -1.228231
       2   -1.236862
    b  0   -0.049346
       1    0.596290
       2   -0.552489
    c  0    1.338643
       1    0.277671
       2   -1.892496
    d  0   -1.344015
       1    0.421452
       2    0.232528
    dtype: float64
    0  a    1.118216
       b   -0.049346
       c    1.338643
       d   -1.344015
    1  a   -1.228231
       b    0.596290
       c    0.277671
       d    0.421452
    2  a   -1.236862
       b   -0.552489
       c   -1.892496
       d    0.232528

    Pandas统计计算和描述

    常用的统计计算

    • sum, mean, max, min…

    axis=0 按列统计,axis=1按行统计

    skipna 排除缺失值, 默认为True

    常用的统计描述

    describe 产生多个统计数据

    常用的统计描述方法:

    demo:

    import numpy as np
    import pandas as pd
    
    df_obj = pd.DataFrame(np.random.randn(5,4), columns = ['a', 'b', 'c', 'd'])
    print("df_obj")
    print(df_obj)
    print("df_obj.sum()")
    print(df_obj.sum())
    print("df_obj.max()")
    print(df_obj.max())
    print("df_obj.min()")
    print(df_obj.min(axis=1, skipna=False))
    print("df_obj.describe()")
    print(df_obj.describe())

    效果:

    df_obj
              a         b         c         d
    0  0.990848 -0.626976 -0.826166 -0.961985
    1  1.314470  0.417564 -0.334301  0.434747
    2  0.451489 -0.182809  0.531624 -1.564701
    3 -1.304920 -0.377381 -2.644873  0.289440
    4  1.379152 -0.150612 -0.608031  1.840602
    df_obj.sum()
    a    2.831040
    b   -0.920214
    c   -3.881746
    d    0.038103
    dtype: float64
    df_obj.max()
    a    1.379152
    b    0.417564
    c    0.531624
    d    1.840602
    dtype: float64
    df_obj.min()
    0   -0.961985
    1   -0.334301
    2   -1.564701
    3   -2.644873
    4   -0.608031
    dtype: float64
    df_obj.describe()
                  a         b         c         d
    count  5.000000  5.000000  5.000000  5.000000
    mean   0.566208 -0.184043 -0.776349  0.007621
    std    1.108532  0.386206  1.164946  1.326086
    min   -1.304920 -0.626976 -2.644873 -1.564701
    25%    0.451489 -0.377381 -0.826166 -0.961985
    50%    0.990848 -0.182809 -0.608031  0.289440
    75%    1.314470 -0.150612 -0.334301  0.434747
    max    1.379152  0.417564  0.531624  1.840602
  • 相关阅读:
    行为模式---之--解释器模式
    行为模式---之--访问者模式
    行为模式---之--状态模式
    行为模式---之--备忘录模式
    行为模式---之--命令模式
    行为模式---之--责任链模式
    行为模式---之--迭代子模式
    行为模式---之--观察者模式
    行为模式---之--模板方法模式
    行为模式---之--策略模式
  • 原文地址:https://www.cnblogs.com/loaderman/p/11967276.html
Copyright © 2011-2022 走看看