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

目录

  1. 创建多层索引
  2.  
  3. 数据重塑与轴向旋转

创建多层索引

隐式构造

Series

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

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

  

DataFrame

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

  

显示构造pd.MultiIndex

使用数组构造

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

  

使用tuple构造

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

  

  1. python math En
  2. 期中 期末 期中 期末 期中 期末
  3. 4 76 53 117 62 29
  4. 124 28 61 13 62 117
  5. 西 87 137 64 125 44 76
  6. 82 120 75 126 78 101

  

使用product构造(推荐)

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

  

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

  

数据重塑与轴向旋转

数据重塑

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

Series的层次化索引

  1. import numpy as np
    import pandas as pd
  2.  
  3. 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']])
  4. print(s)
  5. print(s.index)
  6.  
  7. #取值(外层索引)
  8. print(s['a'])
  9. print(s['a':'c'])
  10.  
  11. #取值(内层索引 )
  12. print(s[:,'1'])
  13.  
  14. #取值(具体值)
  15. print(s['a','1'])
  16.  
  17. #通过unstack方法可以将Series变成一个DataFrame
  18. s=s.unstack()
  19. print(s)
  20. #通过 stack方法可以将stack方法将DataFrame变成Series
  21. s=s.stack()
  22. print(s)

  

  1. #原始数据
    a 1 1
  2. 2 2
  3. 3 3
  4. b 1 4
  5. 2 5
  6. 3 6
  7. c 1 7
  8. 2 8
  9. 3 9
  10. dtype: int32
  11.  
  12. #索引
  13. MultiIndex(levels=[['a', 'b', 'c'], ['1', '2', '3']],
  14. labels=[[0, 0, 0, 1, 1, 1, 2, 2, 2], [0, 1, 2, 0, 1, 2, 0, 1, 2]])
  15.  
  16. #s['a'],通过外层索引取值
  17. 1 1
  18. 2 2
  19. 3 3
  20. dtype: int32
  21.  
  22. #s['a':'c'],切片
  23. a 1 1
  24. 2 2
  25. 3 3
  26. b 1 4
  27. 2 5
  28. 3 6
  29. c 1 7
  30. 2 8
  31. 3 9
  32. dtype: int32
  33.  
  34. #s[:,'1'],内层索引取值
  35. a 1
  36. b 4
  37. c 7
  38. dtype: int32
  39.  
  40. #s['a','1'],取具体值
  41. 1
  42.  
  43. #通过unstack方法将Series转为DataFrame
  44. 1 2 3
  45. a 1 2 3
  46. b 4 5 6
  47. c 7 8 9
  48.  
  49. #通过stack方法将DataFrame转为Series
  50. a 1 1
  51. 2 2
  52. 3 3
  53. b 1 4
  54. 2 5
  55. 3 6
  56. c 1 7
  57. 2 8
  58. 3 9
  59. dtype: int32

DataFrame的层次化索引

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

  

  1. 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)
  2.  
  3. #取值
    # (1) 可以直接使用列名称来进行列索引
    # (2) 使用行索引需要用ix(),loc()等函数
    # 推荐使用loc()函数
    #确定一个值需要四个索引
  4.  
  5. #取列
    print('取列')
    print(data['A','Z'])
  6.  
  7. #取行
    print('取行')
    print(data.loc['a',1])
  8.  
  9. #取某个值
    print('取值')
    print(data.loc['a',1]['A','Z'])

  

  1. 原始数据:
  2. A B
  3. Z X C
  4. a 1 0 1 2
  5. 2 3 4 5
  6. b 1 6 7 8
  7. 2 9 10 11
  8. 取列
  9. a 1 0
  10. 2 3
  11. b 1 6
  12. 2 9
  13. Name: (A, Z), dtype: int32
  14. 取行
  15. A Z 0
  16. X 1
  17. B C 2
  18. Name: (a, 1), dtype: int32
  19. 取值
  20. 0
  1. # set_index是把列变成索引
    # reset_index是把索引变成列
    # 这样做会大大简化我们的筛选环节
  2.  
  3. import numpy as np
    import pandas as pd
    # 读入数据
    df=pd.read_csv('data1.txt')
    print('原始数据')
    print(df)
  4.  
  5. print('设置列为索引')
    df=df.set_index(['产地','名字'])
    print(df)
  6.  
  7. #每一个索引都是一个元组
    print('返回索引的格式')
    print(df.index[0])
  8.  
  9. #获得某一行数据,数据以内层索引为序列
    print('获得某一行数据')
    print(df.loc['美国'])
  10.  
  11. #对调内外层索引
    print('对调内外层索引')
    df=df.swaplevel('产地','名字')
    print(df)
  12.  
  13. #取消层次化索引
    print('取消层次化索引')
    df=df.reset_index()
    print(df)

  

  1. 原始数据
  2. 名字 投票人数 类型 产地 上映时间 时长 年代 评分
  3. 0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
  4. 1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
  5. 2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
  6. 3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
  7. 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 171 1993 9.4
  8. 设置列为索引
  9. 投票人数 类型 上映时间 时长 年代 评分
  10. 产地 名字
  11. 意大利 美丽人生 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5
  12. 美国 阿甘正传 580897 剧情/爱情 1994-06-23 142 1994 9.4
  13. 肖申克的救赎 692795 剧情/犯罪 1994-09-10 142 1994 9.6
  14. 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
  15. 中国大陆 霸王别姬 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4
  16. 返回索引的格式
  17. ('意大利', '美丽人生')
  18. 获得某一行数据
  19. 投票人数 类型 上映时间 时长 年代 评分
  20. 名字
  21. 阿甘正传 580897 剧情/爱情 1994-06-23 142 1994 9.4
  22. 肖申克的救赎 692795 剧情/犯罪 1994-09-10 142 1994 9.6
  23. 控方证人 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
  24. 对调内外层索引
  25. 投票人数 类型 上映时间 时长 年代 评分
  26. 名字 产地
  27. 美丽人生 意大利 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5
  28. 阿甘正传 美国 580897 剧情/爱情 1994-06-23 142 1994 9.4
  29. 肖申克的救赎 美国 692795 剧情/犯罪 1994-09-10 142 1994 9.6
  30. 控方证人 美国 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
  31. 霸王别姬 中国大陆 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4
  32. 取消层次化索引
  33. 名字 产地 投票人数 类型 上映时间 时长 年代 评分
  34. 0 美丽人生 意大利 42995 剧情/喜剧/爱情 1997-12-20 116 1997 9.5
  35. 1 阿甘正传 美国 580897 剧情/爱情 1994-06-23 142 1994 9.4
  36. 2 肖申克的救赎 美国 692795 剧情/犯罪 1994-09-10 142 1994 9.6
  37. 3 控方证人 美国 42995 剧情/悬疑/犯罪 1957-12-17 116 1957 9.5
  38. 4 霸王别姬 中国大陆 478523 剧情/爱情/同性 1993-01-01 171 1993 9.4

  

轴向旋转

  1. import numpy as np
    import pandas as pd
    # 读入数据
    df=pd.read_csv('data1.txt')
    print('原始数据')
    print(df)
  1. #数据旋转
  2. #
  3. # 行和列转化
  4. # .T可以直接让数据的行和列进行交换
  1. print('进行行和列的转换')
    print(df.T)
  2.  
  3. #DataFrame也可以使用stack和unstack,转化为层次化索引的Series
    print('DataFrame---->Series')
    df=df.stack()
    print(df)
  4.  
  5. print('Series--->DataDrame')
    df=df.unstack()
    print(df)

  

  1. 原始数据
  2. 名字 投票人数 类型 产地 上映时间 时长 年代 评分
  3. 0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
  4. 1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
  5. 2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
  6. 3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
  7. 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 171 1993 9.4
  8. 进行行和列的转换
  9. 0 1 2 3 4
  10. 名字 美丽人生 阿甘正传 肖申克的救赎 控方证人 霸王别姬
  11. 投票人数 42995 580897 692795 42995 478523
  12. 类型 剧情/喜剧/爱情 剧情/爱情 剧情/犯罪 剧情/悬疑/犯罪 剧情/爱情/同性
  13. 产地 意大利 美国 美国 美国 中国大陆
  14. 上映时间 1997-12-20 1994-06-23 1994-09-10 1957-12-17 1993-01-01
  15. 时长 116 142 142 116 171
  16. 年代 1997 1994 1994 1957 1993
  17. 评分 9.5 9.4 9.6 9.5 9.4
  18. DataFrame---->Series
  19. 0 名字 美丽人生
  20. 投票人数 42995
  21. 类型 剧情/喜剧/爱情
  22. 产地 意大利
  23. 上映时间 1997-12-20
  24. 时长 116
  25. 年代 1997
  26. 评分 9.5
  27. 1 名字 阿甘正传
  28. 投票人数 580897
  29. 类型 剧情/爱情
  30. 产地 美国
  31. 上映时间 1994-06-23
  32. 时长 142
  33. 年代 1994
  34. 评分 9.4
  35. 2 名字 肖申克的救赎
  36. 投票人数 692795
  37. 类型 剧情/犯罪
  38. 产地 美国
  39. 上映时间 1994-09-10
  40. 时长 142
  41. 年代 1994
  42. 评分 9.6
  43. 3 名字 控方证人
  44. 投票人数 42995
  45. 类型 剧情/悬疑/犯罪
  46. 产地 美国
  47. 上映时间 1957-12-17
  48. 时长 116
  49. 年代 1957
  50. 评分 9.5
  51. 4 名字 霸王别姬
  52. 投票人数 478523
  53. 类型 剧情/爱情/同性
  54. 产地 中国大陆
  55. 上映时间 1993-01-01
  56. 时长 171
  57. 年代 1993
  58. 评分 9.4
  59. dtype: object
  60. Series--->DataDrame
  61. 名字 投票人数 类型 产地 上映时间 时长 年代 评分
  62. 0 美丽人生 42995 剧情/喜剧/爱情 意大利 1997-12-20 116 1997 9.5
  63. 1 阿甘正传 580897 剧情/爱情 美国 1994-06-23 142 1994 9.4
  64. 2 肖申克的救赎 692795 剧情/犯罪 美国 1994-09-10 142 1994 9.6
  65. 3 控方证人 42995 剧情/悬疑/犯罪 美国 1957-12-17 116 1957 9.5
  66. 4 霸王别姬 478523 剧情/爱情/同性 中国大陆 1993-01-01 171 1993 9.4

  

pandas学习(创建多层索引、数据重塑与轴向旋转)的更多相关文章

  1. 8 pandas模块,多层索引

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

  2. pandas学习(四)--数据的归一化

    欢迎加入python学习交流群 667279387 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学习(四)–数据 ...

  3. Pandas学习(一)——数据的导入

    欢迎加入python学习交流群 667279387 学习笔记汇总 Pandas学习(一)–数据的导入 pandas学习(二)–双色球数据分析 pandas学习(三)–NAB球员薪资分析 pandas学 ...

  4. Pandas重塑和轴向旋转

    重塑和轴向旋转 Se import pandas as pd import numpy as np from pandas import Series data=pd.DataFrame(np.ara ...

  5. javascript学习-创建json对象数据,遍历

    之前我已经有讲过后台返回json数据到前台,并在前台遍历json数据. 这里讲下直接在JS里创建JSON数据,然后遍历使用~ 创建代码例如以下:(创建的是JSON对象) var YearSelect ...

  6. mongodb学习-创建唯一索引(在已存在的集合创建)

    如果在已存在的集合创建,可能会存在相同的值如下: 我们可以使用(2.x版本) db.users.ensureIndex({uid:1, name:1}, {unique:true, dropDups: ...

  7. pandas(八)重塑和轴向旋转

    重塑层次化索引 层次化索引为DataFrame的重排提供了良好的一致性操作,主要方法有 stack :将数据的列旋转为行 unstack:将数据的行转换为列 用一个dataframe对象举例 In [ ...

  8. python中pandas数据分析基础3(数据索引、数据分组与分组运算、数据离散化、数据合并)

    //2019.07.19/20 python中pandas数据分析基础(数据重塑与轴向转化.数据分组与分组运算.离散化处理.多数据文件合并操作) 3.1 数据重塑与轴向转换1.层次化索引使得一个轴上拥 ...

  9. pandas:多层索引

    多层索引是指在行或者列轴上有两个及以上级别的索引,一般表示一个数据的几个分项. 1.创建多层索引 1.1通过分组产生多层索引 1.2由序列创建 1.3由元组创建 1.4可迭代对象的笛卡尔积 1.5将D ...

随机推荐

  1. mongodb系列~关于双活状态的mongodb集群

    一简介:说说我们异地双活的集群 二 背景:需要建立异地双活的架构 三 构建 1 需要保证第二机房至少两个副本集DB,这样在第一机房挂掉后才能保证第二机房的可用性 2 集群状态下第二机房启用config ...

  2. PP图和QQ图

     一. QQ图      分位数图示法(Quantile Quantile Plot,简称 Q-Q 图)       统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ...

  3. mac 报错Root chmod operation not permitted on file

    系统:mac os 10.14.1 重启电脑 mac用户在升级系统之后,电脑启用了SIP(System Integrity Protection),增加了rootless机制,导致即使在root权限下 ...

  4. springboot系列十一、redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

    一.redisTemplate和stringRedisTemplate对比 RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出 ...

  5. dubbo 一个接口多个实现

    <dubbo:service ref="dubboGroupService1" interface="com.yncp.dubbo.service.IDubboGr ...

  6. Android手势滑动Tab

    Android手势滑动Tab //MainActivity.java public class MainActivity extends TabActivity { ; ; ; private Ges ...

  7. vue系列之核心思想

    1.数据驱动 只要改变数据,Vuejs会通过Directives指令对DOM进行封装,当数据发生变化,会通知相应的DOM进行变化 Vuejs会对DOM进行监听,通过DOMListeners监听视图的变 ...

  8. python调用修改变量新方法

    def foo(): count = [1] #将变量放在列表中,此时,内部函数就可以修改了 def bar(): count[0] = count[0] + 1 return count[0] re ...

  9. python 全栈开发,Day43(python全栈11期月考题)

    python全栈11期月考题 1.常用字符串格式化有哪些?并说明他们的区别 2.请手写一个单例模式(面试题) 3.利用 python 打印前一天的本地时间,格式为‘2018-01-30’(面试题) 4 ...

  10. 步步为营-55-js练习

    1:加法计算器 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head&g ...