当前位置 博文首页 > pandas多层索引的创建和取值以及排序的实现

    pandas多层索引的创建和取值以及排序的实现

    作者:蓝小白1024 时间:2021-07-16 17:47

    多层索引的创建

    普通-多个index创建

    • 在创建数据的时候加入一个index列表,这个index列表里面是多个索引列表

    Series多层索引的创建方法

    import pandas as pd
    s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
                      ['期中','期末','期中','期末','期中','期末']])
    # print(s)
    s
    

    张三  期中    1
        期末    2
    李四  期中    3
        期末    4
    王五  期中    5
        期末    6
    dtype: int64

    利用 numpy中的随机数

    import numpy as np
    
    data = np.random.randint(0,100,size=(6,3))
    # np.random.randint(0,100,size=(6,3))是使用numpy中的随机模块random中,生成随机整数方法randint,
    # 里面的参数size是指定生成6行3列的数据,并且每个数字的范围在0到100之间
    
    data
    
    array([[44, 66, 67],
        [82, 52, 0],
        [34, 78, 23],
        [38, 4, 43],
        [60, 62, 40],
        [57, 9, 11]])

    Dataframe多层索引创建

    import pandas as pd
    import numpy as np
    
    data = np.random.randint(0,100,size=(6,3))
    df = pd.DataFrame(data,index=[['张三','张三','李四','李四','王五','王五'],
                   ['期中','期末','期中','期末','期中','期末']],
               columns=['Java','Web','Python'])
    
    df
    

    Java Web Python
    张三 期中 68 4 90
    期末 33 63 73
    李四 期中 30 13 68
    期末 14 18 48
    王五 期中 34 66 26
    期末 89 10 35

    简化创建-from_product()

    import pandas as pd
    import numpy as np
    
    data = np.random.randint(0,100,size=(6,3))
    names = ['张三','李四','王五']
    exam = ['期中','期末']
    index = pd.MultiIndex.from_product([names,exam])
    df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
    # print(df)
    df
    

    Java Web Python
    张三 期中 51 78 47
    期末 39 53 36
    李四 期中 33 60 83
    期末 90 55 3
    王五 期中 37 45 66
    期末 6 82 71

    from_product()在这个里面的列表中位置不同, 产生的索引页会不同

    index = pd.MultiIndex.from_product([exam, names])
    df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
    # print(df)
    df

    Java Web Python
    期中 张三 51 78 47
    李四 39 53 36
    王五 33 60 83
    期末 张三 90 55 3
    李四 37 45 66
    王五 6 82 71

    from_product([exam,names])会将列表中第一个元素作为最外层索引,依次类推

    多层索引的取值

    获取到我们想要的数据

    获取多层索引Series中的数据

    创建数据

    import pandas as pd
    s = pd.Series([1,2,3,4,5,6],index=[['张三','张三','李四','李四','王五','王五'],
                      ['期中','期末','期中','期末','期中','期末']])
    print(s)

    张三  期中    1
        期末    2
    李四  期中    3
        期末    4
    王五  期中    5
        期末    6
    dtype: int64

    可以直接使用[]的方式取最外面的一个层级 s[‘张三']

    s['李四']
    
    # 注意:[]取值方式,不可直接使用最外层以外的其他层级,例如:s['期末']
    
    

    期中    3
    期末    4
    dtype: int64

    使用['外索引', '内索引'], 获取某个数据

    注意:[‘张三',‘期末']他们的顺序不能变。剥洋葱原则,从外到内一层一层的剥。

    s['李四', '期中'] # 李四期中分值
    
    # 注意:['张三','期末']他们的顺序不能变。剥洋葱原则,从外到内一层一层的剥。
    
    

    3

    使用[]的切片,获取数据s[:,‘期中']

    s[:,'期中'] # 第一个值为全部的外索引

    张三    1
    李四    3
    王五    5
    dtype: int64

    使用 loc

    • loc 使用的是标签suoyin
    • iloc使用的是位置索引
    # loc 使用方式与 [] 的方式基本一样
    
    s.loc['张三']
    s.loc['张三','期中']
    s.loc[:,'期中']
    
    # iloc 的取值并不会受多层索引影响,只会根据数据的位置索引进行取值, 不推荐
    
    

    张三    1
    李四    3
    王五    5
    dtype: int64

    多层索引DataFrame的取值

    在对多层索引DataFrame的取值是,推荐使用 loc() 函数

    import pandas as pd
    import numpy as np
    #size参数是指定生成6行3列的数组
    data = np.random.randint(0,100,size=(6,3))
    names = ['张三','李四','王五']
    exam = ['期中','期末']
    index = pd.MultiIndex.from_product([names,exam])
    df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
    df
    

    Java Web Python
    张三 期中 3 40 52
    期末 74 38 85
    李四 期中 7 28 16
    期末 9 25 0
    王五 期中 13 24 8
    期末 49 46 1

    三种方式都可以获取张三期中各科成绩

    # df.loc['张三','期中']
    # df.loc['张三'].loc['期中']
    # df.loc[('张三','期中')]
    

    注意:DataFrame中对行索引的时候和Series有一个同样的注意点,就是无法直接对二级索引直接进行索引,必须让二级索引变成一级索引后才能对其进行索引

    多层索引的排序

    • 使用sort_index() 排序
    • level参数可以指定是否按照指定的层级进行排列
    • 第一层索引值为0, 第二层索引的值为1

    创建数据

    import pandas as pd
    data = np.random.randint(0,100,size=(9,3))
    key1 = ['b','c','a']
    key2 = [2,1,3]
    index = pd.MultiIndex.from_product([key1,key2])
    df = pd.DataFrame(data,index=index,columns=['Java','Web','Python'])
    
    df 
    
    

    Java Web Python
    b 2 56 82 81
    1 84 16 55
    3 35 25 86
    c 2 76 1 76
    1 36 28 94
    3 79 70 97
    a 2 25 17 30
    1 38 38 78
    3 41 75 90

    排序

    • DataFrame按行索引排序的方法是sort_index()
    • 如果直接使用的话,不传参数, 会把每一层索引根据值进行升序排序
    df.sort_index()

    Java Web Python
    a 1 18 60 74
    2 66 87 27
    3 96 18 64
    b 1 72 58 52
    2 22 31 22
    3 31 12 83
    c 1 6 54 96
    2 9 47 18
    3 31 63 4

    # 当level=0时,ascending=False, 会根据第一层索引值进行降序排序
    df.sort_index(level=0,ascending=False)

    Java Web Python
    c 3 79 70 97
    2 76 1 76
    1 36 28 94
    b 3 35 25 86
    2 56 82 81
    1 84 16 55
    a 3 41 75 90
    2 25 17 30
    1 38 38 78

    # 当level=1时,会根据第二层索引值进行降序排序
    
    df.sort_index(level=1,ascending=False)
    
    # 数据会根据第二层索引值进行相应的降序排列,
    # 如果索引值相同时会根据其他层索引值排列
    

    Java Web Python
    c 3 79 70 97
    b 3 35 25 86
    a 3 41 75 90
    c 2 76 1 76
    b 2 56 82 81
    a 2 25 17 30
    c 1 36 28 94
    b 1 84 16 55
    a 1 38 38 78

    通过level设置排序的索引层级,其他层索引也会根据其排序规则进行排序

    jsjbwy
    下一篇:没有了