• pandas学习(创建多层索引、数据重塑与轴向旋转)


    pandas学习(创建多层索引、数据重塑与轴向旋转)

    目录

    创建多层索引

    数据重塑与轴向旋转

    创建多层索引

    隐式构造

    Series

    最常见的方法是给DataFrame构造函数的index参数传递两个或更多的数组,Series也可以创建多层索引。

    s = Series(np.random.randint(0,150,size=6),index=[['a','a','b','b','c','c'],['期中','期末','期中','期末','期中','期末']])
    
    # 输出
    a  期中    59
       期末    43
    b  期中    28
       期末    99
    c  期中    92
       期末    58
    dtype: int32
    

      

    DataFrame

    df1 = DataFrame(np.random.randint(0,150,size=(4,6)),
                   index = list('东南西北'),
                   columns=[['python','python','math','math','En','En'],['期中','期末','期中','期末','期中','期末']])
    
    
          python      math       En    
          期中   期末   期中  期末   期中  期末
    东    137  119   22   3  130  79
    南     90  146   60  80  143  23
    西    105   31  125  87    7  66
    北    131   62   13  67   81   3
    

      

     

    显示构造pd.MultiIndex

    使用数组构造

    df2 = DataFrame(np.random.randint(0,150,size=(4,6)),
    index = list('东南西北'),
    columns=[['python','python','math','math','En','En'],['期中','期末','期中','期末','期中','期末']])
    
          python      math        En     
          期中   期末   期中   期末   期中   期末
    东     99   10  148    9  146  104
    南     65   75    7    1   74  107
    西    136   45   83  121   61   12
    北    143  131   85   27   55   47
    

      

    使用tuple构造

    df3 = DataFrame(np.random.randint(0,150,size=(4,6)),
                   index = list('东南西北'),
                   columns =pd.MultiIndex.from_tuples([('python','期中'),('python','期末'),
                                                      ('math','期中'),('math','期末'),
                                                      ('En','期中'),('En','期末')]))
    

      

          python      math       En     
          期中   期末   期中   期末  期中   期末
    东      4   76   53  117  62   29
    南    124   28   61   13  62  117
    西     87  137   64  125  44   76
    北     82  120   75  126  78  101
    

      

    使用product构造(推荐)

    df4 = DataFrame(np.random.randint(0,150,size=(8,12)),
                   columns = pd.MultiIndex.from_product([['模拟考','正式考'],
                                                       ['数学','语文','英语','物理','化学','生物']]),
                   index = pd.MultiIndex.from_product([['期中','期末'],
                                                       ['雷军','李斌'],
                                                      ['测试一','测试二']]))
    
    

      

               模拟考                           正式考                         
                数学   语文   英语   物理   化学   生物   数学   语文   英语   物理   化学   生物
    期中 雷军 测试一   18   74  113   13   15   73   80  122   80   45   38  103
          测试二  107   21    7  110   50   32   94   61   78  107   29   17
       李斌 测试一   62   73   41    8  111   89  100   27   70   58   78    9
          测试二  142   57   22  103  121  117  134   76  122  112  147  129
    期末 雷军 测试一  129   26  144  106   63  130   23   68   64   92  126   86
          测试二  135   84  137   44  121   64  133   56   70  116  147   96
       李斌 测试一   56  141   40   20   83   84  133  144  105  100  129   52
          测试二   73    3  114  103  105   41   85   39   30  112   94   64
    

      

    数据重塑与轴向旋转

    数据重塑

    层次化索引:层次化索引pandas的一项重要功能,它能使我们在一个轴上拥有多个索引

    Series的层次化索引

    import numpy as np
    import pandas as pd

    s=pd.Series(np.arange(1,10),index=[['a','a','a','b','b','b','c','c','c'],['1','2','3','1','2','3','1','2','3']]) print(s) print(s.index) #取值(外层索引) print(s['a']) print(s['a':'c']) #取值(内层索引 ) print(s[:,'1']) #取值(具体值) print(s['a','1']) #通过unstack方法可以将Series变成一个DataFrame s=s.unstack() print(s) #通过 stack方法可以将stack方法将DataFrame变成Series s=s.stack() print(s)

      

    #原始数据
    a 1 1 2 2 3 3 b 1 4 2 5 3 6 c 1 7 2 8 3 9 dtype: int32

    #索引 MultiIndex(levels=[['a', 'b', 'c'], ['1', '2', '3']], labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])

    #s['a'],通过外层索引取值 1 1 2 2 3 3 dtype: int32

    #s['a':'c'],切片 a 1 1 2 2 3 3 b 1 4 2 5 3 6 c 1 7 2 8 3 9 dtype: int32

    #s[:,'1'],内层索引取值 a 1 b 4 c 7 dtype: int32

    #s['a','1'],取具体值 1


    #通过unstack方法将Series转为DataFrame 1 2 3 a 1 2 3 b 4 5 6 c 7 8 9

    #通过stack方法将DataFrame转为Series a 1 1 2 2 3 3 b 1 4 2 5 3 6 c 1 7 2 8 3 9 dtype: int32

    DataFrame的层次化索引

    #对于 DataFrame来说,行和列都能进行层次化索引,这就是说,可以有四个索引
    #set_index可以把列变成索引
    #reset_index是把索引变成列
    #每一个索引都是一个元组
    

      

    import numpy as np
    import pandas as pd
    data=pd.DataFrame(np.arange(12).reshape(4,3),index=[['a','a','b','b'],[1,2,1,2]],columns=[['A','A','B'],['Z','X','C']])
    print('原始数据:')
    print(data)



    #取值
    # (1) 可以直接使用列名称来进行列索引
    # (2) 使用行索引需要用ix(),loc()等函数
    # 推荐使用loc()函数
    #确定一个值需要四个索引

    #取列
    print('取列')
    print(data['A','Z'])

    #取行
    print('取行')
    print(data.loc['a',1])

    #取某个值
    print('取值')
    print(data.loc['a',1]['A','Z'])

      

    原始数据:
         A       B
         Z   X   C
    a 1  0   1   2
      2  3   4   5
    b 1  6   7   8
      2  9  10  11
    取列
    a  1    0
       2    3
    b  1    6
       2    9
    Name: (A, Z), dtype: int32
    取行
    A  Z    0
       X    1
    B  C    2
    Name: (a, 1), dtype: int32
    取值
    0
    
    # set_index是把列变成索引
    # reset_index是把索引变成列
    # 这样做会大大简化我们的筛选环节

    import numpy as np
    import pandas as pd
    # 读入数据
    df=pd.read_csv('data1.txt')
    print('原始数据')
    print(df)

    print('设置列为索引')
    df=df.set_index(['产地','名字'])
    print(df)


    #每一个索引都是一个元组
    print('返回索引的格式')
    print(df.index[0])

    #获得某一行数据,数据以内层索引为序列
    print('获得某一行数据')
    print(df.loc['美国'])


    #对调内外层索引
    print('对调内外层索引')
    df=df.swaplevel('产地','名字')
    print(df)

    #取消层次化索引
    print('取消层次化索引')
    df=df.reset_index()
    print(df)

      

    原始数据
           名字    投票人数        类型    产地        上映时间   时长    年代   评分
    0    美丽人生   42995  剧情/喜剧/爱情   意大利  1997-12-20  116  1997  9.5
    1    阿甘正传  580897     剧情/爱情    美国  1994-06-23  142  1994  9.4
    2  肖申克的救赎  692795     剧情/犯罪    美国  1994-09-10  142  1994  9.6
    3    控方证人   42995  剧情/悬疑/犯罪    美国  1957-12-17  116  1957  9.5
    4    霸王别姬  478523  剧情/爱情/同性  中国大陆  1993-01-01  171  1993  9.4
    设置列为索引 投票人数 类型 上映时间 时长 年代 评分 产地 名字 意大利 美丽人生 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5 美国 阿甘正传 580897 剧情/爱情 1994-06-23 142 1994 9.4 肖申克的救赎 692795 剧情/犯罪 1994-09-10 142 1994 9.6 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5 中国大陆 霸王别姬 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4
    返回索引的格式 ('意大利', '美丽人生')
    获得某一行数据 投票人数 类型 上映时间 时长 年代 评分 名字 阿甘正传 580897 剧情/爱情 1994-06-23 142 1994 9.4 肖申克的救赎 692795 剧情/犯罪 1994-09-10 142 1994 9.6 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
    对调内外层索引 投票人数 类型 上映时间 时长 年代 评分 名字 产地 美丽人生 意大利 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5 阿甘正传 美国 580897 剧情/爱情 1994-06-23 142 1994 9.4 肖申克的救赎 美国 692795 剧情/犯罪 1994-09-10 142 1994 9.6 控方证人 美国 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5 霸王别姬 中国大陆 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4
    取消层次化索引 名字 产地 投票人数 类型 上映时间 时长 年代 评分 0 美丽人生 意大利 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5 1 阿甘正传 美国 580897 剧情/爱情 1994-06-23 142 1994 9.4 2 肖申克的救赎 美国 692795 剧情/犯罪 1994-09-10 142 1994 9.6 3 控方证人 美国 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5 4 霸王别姬 中国大陆 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4

      

    轴向旋转

    import numpy as np
    import pandas as pd
    # 读入数据
    df=pd.read_csv('data1.txt')
    print('原始数据')
    print(df)
    #数据旋转
    # 
    # 行和列转化
    # .T可以直接让数据的行和列进行交换
    print('进行行和列的转换')
    print(df.T)

    #DataFrame也可以使用stack和unstack,转化为层次化索引的Series
    print('DataFrame---->Series')
    df=df.stack()
    print(df)

    print('Series--->DataDrame')
    df=df.unstack()
    print(df)

      

    原始数据
           名字    投票人数        类型    产地        上映时间   时长    年代   评分
    0    美丽人生   42995  剧情/喜剧/爱情   意大利  1997-12-20  116  1997  9.5
    1    阿甘正传  580897     剧情/爱情    美国  1994-06-23  142  1994  9.4
    2  肖申克的救赎  692795     剧情/犯罪    美国  1994-09-10  142  1994  9.6
    3    控方证人   42995  剧情/悬疑/犯罪    美国  1957-12-17  116  1957  9.5
    4    霸王别姬  478523  剧情/爱情/同性  中国大陆  1993-01-01  171  1993  9.4
    进行行和列的转换 0 1 2 3 4 名字 美丽人生 阿甘正传 肖申克的救赎 控方证人 霸王别姬 投票人数 42995 580897 692795 42995 478523 类型 剧情/喜剧/爱情 剧情/爱情 剧情/犯罪 剧情/悬疑/犯罪 剧情/爱情/同性 产地 意大利 美国 美国 美国 中国大陆 上映时间 1997-12-20 1994-06-23 1994-09-10 1957-12-17 1993-01-01 时长 116 142 142 116 171 年代 1997 1994 1994 1957 1993 评分 9.5 9.4 9.6 9.5 9.4
    DataFrame---->Series 0 名字 美丽人生 投票人数 42995 类型 剧情/喜剧/爱情 产地 意大利 上映时间 1997-12-20 时长 116 年代 1997 评分 9.5 1 名字 阿甘正传 投票人数 580897 类型 剧情/爱情 产地 美国 上映时间 1994-06-23 时长 142 年代 1994 评分 9.4 2 名字 肖申克的救赎 投票人数 692795 类型 剧情/犯罪 产地 美国 上映时间 1994-09-10 时长 142 年代 1994 评分 9.6 3 名字 控方证人 投票人数 42995 类型 剧情/悬疑/犯罪 产地 美国 上映时间 1957-12-17 时长 116 年代 1957 评分 9.5 4 名字 霸王别姬 投票人数 478523 类型 剧情/爱情/同性 产地 中国大陆 上映时间 1993-01-01 时长 171 年代 1993 评分 9.4 dtype: object
    Series--->DataDrame 名字 投票人数 类型 产地 上映时间 时长 年代 评分 0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5 1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4 2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6 3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 171 1993 9.4

      

  • 相关阅读:
    Inno Setup命令行安装卸载参数
    Fragment生命周期
    ubuntu 64位系统下加速Android模拟器
    Java中对SQLite数据库操作 操作db文件
    系统权限管理设计
    java 中的序列化是什么意思?有什么好处?
    js实现定时调用的函数setInterval()
    tomcat 并发配置优化
    centOS下 JDK的三种安装方式
    Linux 配置静态Ip地址
  • 原文地址:https://www.cnblogs.com/-wenli/p/10287202.html
Copyright © 2020-2023  润新知