Python数据分析pandas之多层高维索引

DataFrame多层索引

多层索引简介

众所周知Pandas的Series和DataFrame存放的是一维和二维数组,那么想存放多维数组就得通过多层索引来实现。通常一维的索引能够满足我们的大部分需求,但如果我们想通过Pandas存储高维数据,那么就要用到多层索引,这里层即是层次(hierarchy)、级(Level)。

层(维)比较好理解的例子就是地理位置,如行政区划(国家、省、市、县等)。

初始化多层索引

通过from_tuples元组生成

多层索引通过元组方式创建,这种方式索引的key存放在元组内。多层索引由levels和codes构成。

注:

1 这里多维索引的levels是元组的元素的值。

2 这里多维索引的codes是对元组元素进行的编码,如0,1,2等。

#比如这里定义了关于学生年份、学习周期定义的多层(维)索引。
import pandas as pd  index=[(2010,'期中'),(2011,'期中'),(2012,'期中'),
(2010,'期末'),(2011,'期末'),(2012,'期末')]
index = pd.MultiIndex.from_tuples(index)
#查看索引
print(index)name=["张三","张三","张三","李四","李四","李四"]
score=[100,60,80,55,45,35]
data = np.zeros(6, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
#查看多层索引下的数据
print(data) #结果
MultiIndex(levels=[[2010, 2011, 2012], ['期中', '期末']],codes=[[0, 1, 2, 0, 1, 2], [0, 0, 0, 1, 1, 1]])name  score
2010 期中   张三    100
2011 期中   张三     60
2012 期中   张三     80
2010 期末   李四     55
2011 期末   李四     45
2012 期末   李四     35

通过from_arrays数组生成

#from_arrays方式是在数组里分别定义每个层(维)下的索引值,索引值会自动一一匹配,形成多层索引。它的特点是同层(维)的索引值会重复。
import pandas as pd
index=[[2010,2011,2012,2010,2011,2012],['期中','期中','期中','期末','期末','期末']]
index = pd.MultiIndex.from_arrays(index)
print(index)name=["张三","张三","张三","李四","李四","李四"]
score=[100,60,80,55,45,35]
data = np.zeros(6, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
print(data)
#结果
MultiIndex(levels=[[2010, 2011, 2012], ['期中', '期末']],codes=[[0, 1, 2, 0, 1, 2], [0, 0, 0, 1, 1, 1]])name  score
2010 期中   张三    100
2011 期中   张三     60
2012 期中   张三     80
2010 期末   李四     55
2011 期末   李四     45
2012 期末   李四     35

通过from_product生成

#from_product方式是在数组里分别定义各自维度下的索引,索引会通过笛卡尔积的形式自动形成多层索引。它的特点是同层(维)的索引值不会重复。import pandas as pd
index=[['期中','期末'],[2010,2011,2012]] #注意index里数组元素的顺序。
index = pd.MultiIndex.from_product(index)
print(index)name=["张三","张三","张三","李四","李四","李四"]
score=[100,60,80,55,45,35]
data = np.zeros(6, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
print(data)
#结果
MultiIndex(levels=[['期中', '期末'], [2010, 2011, 2012]],codes=[[0, 0, 0, 1, 1, 1], [0, 1, 2, 0, 1, 2]])name  score
期中 2010   张三    1002011   张三     602012   张三     80
期末 2010   李四     552011   李四     452012   李四     35

访问多层索引

给索引命名

索引如果不指定名字,默认是None,我们可以通过dataframe的index.names给索引命名。

#通过index.names给索引赋值
import pandas as pd
index=[['期中','期末'],[2010,2011,2012]]
index = pd.MultiIndex.from_product(index)
print(index)name=["张三","张三","张三","李四","李四","李四"]
score=[100,60,80,55,45,35]
data = np.zeros(6, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
print(data.index.names)
data.index.names=['period','year']
print(data.index.names)
#结果
[None, None]
['period', 'year']

通过loc检索切片多层索引对象

import pandas as pd
index=[['期中','期末'],[2010,2011,2012]]
index = pd.MultiIndex.from_product(index)name=["张三","张三","张三","李四","李四","李四"]
score=[100,60,80,55,45,35]
data = np.zeros(6, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
print(data.loc['期中',2010])
#如下注释部分效果同上
# print(data.loc[('期中',2011),['score','name']])
#仅检索分数信息
print(data.loc['期中',2010]['score'])
print(data.loc['期中',2010].loc['score'])
#结果
name      张三
score    100
Name: (期中, 2010), dtype: object
100
100

通过xs访问多层索引对象的索引

#通过xs对多层索引对象的索引和列分别访问。
注:1这里的xs的参数axis='columns' 和axis=1等价,为列方向,axis='index' 和axis=0等价为索引方向。
2 xs在访问索引时需要指定要查询的具体key值,否则会报错。
3 xs在访问索引时需要指定对应的level,否则会报错。#注意,当前多层索引为学期周期、年份、难度,学生数据(列)为姓名、分数。#查询层年份(2011年)和等级(B)对应的数据。import pandas as pd
index=[['期中','期末'],[2010,2011,2012],['A','B']]
index = pd.MultiIndex.from_product(index)name=["张三","张三","张三","张三","张三","张三","李四","李四","李四","李四","李四","李四"]
score=[100,60,80,90,50,70,55,45,35,45,35,25]
data = np.zeros(12, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
data.index.name=['period','year','dgreee']
#查询2010年的数据,这里年份所在的level是第2个,所以这里level=1.
print(data.xs(2011,axis=0,level=1)) #axis='columns' axis=1
print("*******************************") #查询等级B对应的数据,这里的等级索引所在的level是第3个,所以这里level=2.
print(data.xs('B',axis=0,level=2)) #axis='columns' axis=1
#结果name  score
期中 A   张三     80B   张三     90
期末 A   李四     35B   李四     45
*******************************
name  score
期中 2010   张三     60    2011   张三     90    2012   张三     70
期末 2010   李四     45    2011   李四     45    2012   李四     25

通过xs访问多层索引对象的列

类似xs对索引的检索,这里指定axis='columns' 或axis=1即可。

#查询分数列
import pandas as pd
index=[['期中','期末'],[2010,2011,2012],['A','B']]
index = pd.MultiIndex.from_product(index)name=["张三","张三","张三","张三","张三","张三","李四","李四","李四","李四","李四","李四"]
score=[100,60,80,90,50,70,55,45,35,45,35,25]
data = np.zeros(12, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
data.index.name=['period','year','dgreee']
print(data.xs('score',axis='columns'))
#等价于#axis='columns'
#print(data.xs('score',axis=1))
#结果
期中  2010  A    100B     602011  A     80B     902012  A     50B     70
期末  2010  A     55B     452011  A     35B     452012  A     35B     25

通过T对多层索引转置

#通过DataFrame的T方法对原有的多层索引进行转置,即原有的列为索引,索引合并为列。
index=[['期中','期末'],[2010,2011,2012]]
index = pd.MultiIndex.from_product(index)name=["张三","张三","张三","李四","李四","李四"]
score=[100,60,80,55,45,35]
data = np.zeros(6, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})
data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
data.index.name=['period','year']
print(data.T)
#结果期中             期末          2010 2011 2012 2010 2011 2012
name    张三   张三   张三   李四   李四   李四
score  100   60   80   55   45   35

通过unstack将索引转换为列

#指定索引序号,通过unstack将该索引转换为列。
import pandas as pd
index=[['期中','期末'],[2010,2011,2012],['A','B']]
index = pd.MultiIndex.from_product(index)name=["张三","张三","张三","张三","张三","张三","李四","李四","李四","李四","李四","李四"]
score=[100,60,80,90,50,70,55,45,35,45,35,25]
data = np.zeros(12, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
data.index.name=['period','year','dgreee']
#这里将第2个索即年份转换为了列。
print(data.unstack(level=1))
#结果name           score          2010 2011 2012  2010 2011 2012
期中 A   张三   张三   张三   100   80   50B   张三   张三   张三    60   90   70
期末 A   李四   李四   李四    55   35   35B   李四   李四   李四    45   45   25

通过stack将列转换为索引

#通过stack将列转回索引。
import pandas as pd
index=[['期中','期末'],[2010,2011,2012],['A','B']]
index = pd.MultiIndex.from_product(index)name=["张三","张三","张三","张三","张三","张三","李四","李四","李四","李四","李四","李四"]
score=[100,60,80,90,50,70,55,45,35,45,35,25]
data = np.zeros(12, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
data.index.name=['period','year','dgreee']
#这里相当于还是data自身,因为做了索引转列,又还原回去。
print(data.unstack(level=1)) .stack())
#结果name  score
期中 A 2010   张三    100      2011   张三     80      2012   张三     50    B 2010   张三     60      2011   张三     90      2012   张三     70
期末 A 2010   李四     55      2011   李四     35      2012   李四     35    B 2010   李四     45      2011   李四     45      2012   李四     25

按照多层索引进行统计计算

#按照指定的多层索引进行列的汇总统计计算,当前以均值为例
import pandas as pd
index=[['期中','期末'],[2010,2011,2012],['A','B']]
index = pd.MultiIndex.from_product(index)name=["张三","张三","张三","张三","张三","张三","李四","李四","李四","李四","李四","李四"]
score=[100,60,80,90,50,70,55,45,35,45,35,25]
data = np.zeros(12, dtype={'names': ('name', 'score'),'formats': ('U10', 'i4')})data['name']=name
data['score']=score
data=pd.DataFrame(data=data,index=index)
data.index.name=['period','year','dgreee']
print(data)
#这里的level=1即对应year索引。
print(data.mean(level=1))
#结果,这里以2012年为例,计算明细为(50+70+35+25)/4=180/4=45.0name  score
期中 2010 A   张三    100B   张三     602011 A   张三     80B   张三     902012 A   张三     50B   张三     70
期末 2010 A   李四     55B   李四     452011 A   李四     35B   李四     452012 A   李四     35B   李四     25score
2010   65.0
2011   62.5
2012   45.0

Python数据分析pandas之多层高维索引相关推荐

  1. Python数据分析pandas之数据拼接与连接

    Python数据分析pandas之数据拼接与连接 数据拼接处理 数据拼接处理指的是numpy.pandas里对数据的拼接.连接.合并等多种方法的概称.有时我们处理的数据会分很多步骤,而中间或者最终的结 ...

  2. Python数据分析pandas之分组统计透视表

    Python数据分析pandas之分组统计透视表 数据聚合统计 Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小).max(最大).avg(平均值).sum(求和) ...

  3. Python数据分析pandas之dataframe初识

    Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...

  4. Python数据分析pandas之series初识

    Python数据分析pandas之series初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上,它通 ...

  5. Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表

    系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...

  6. Python数据分析pandas入门(一)------十分钟入门pandas

    Python数据分析基础 一.导入常用库 二.创建对象 三.查看数据 四.选取 五.通过标签选取 六.通过位置选取 七.布尔索引 八.赋值 九.缺失值处理 十.运算与统计 十一.Apply函数的作用 ...

  7. Python数据分析pandas入门练习题(四)

    Python数据分析基础 Preparation Exercise 1 - Filtering and Sorting Data Step 1. Import the necessary librar ...

  8. 【学习笔记】python数据分析-Pandas

    目录 pandas数据结构 创建Series数据 创建DataFrame数据 pandas的索引操作 重新索引 更换索引 索引选取 选取行 选取列 布尔选择 pandas的增删改 增加行或列 删除行或 ...

  9. python数据分析-pandas学习

    文章目录 一.pandas环境的搭建 1.pandas 简介 2.pandas安装和调用 二.pandas学习 1.pandas简介 2.pandas学习资源 3.pandas核心数据结构 4.Ser ...

最新文章

  1. win10内核linux,windows 10中发布完整的Linux内核
  2. python(numpy,pandas11)——pandas merge根据索引合并数据
  3. P1972 [SDOI2009]HH的项链
  4. 【工作感悟】java编程规范pdf下载
  5. JVM调优-GC参数
  6. 关于mysql单表支持的最大大小
  7. 【Antlr】unknown attribute text for rule stat in $stat.text
  8. 高中必备学习软件_10个适合高中生学习的网站amp;软件,完全免费,9科全覆盖!...
  9. Ubuntu为julia安装深度学习框架MXNet(支持CUDA和OPenCV编译)
  10. OpenStack 存储服务 Cinder介绍和控制节点部署 (十三)
  11. rocketmq 两个线程同时消费一个消息
  12. python表格数据对比_python入门之对比两份excel表格数据
  13. MIMO技术中的各种增益分析
  14. 轻松记录南极最美丽风景 有TA就已经足够
  15. iOS/Android 微信及浏览器中唤起本地APP
  16. 密码学常用网站与解密脚本
  17. 华为首个芯片工厂封顶!
  18. 长高不仅靠遗传,让孩子再次长高的秘诀都在这
  19. 公共计算机课的价值取向是什么意思,提问:1、新课改与新课程标准的价值取向是什么?...
  20. 神经网络模型结果怎么看,图像识别神经网络模型

热门文章

  1. 惠普HP LaserJet Pro M305dn 打印机驱动
  2. Python使用镜像下载安装包
  3. 如何内置客制(第三方)的apk到ROM中
  4. 支付宝员工因绩效3.25B被辞退,员工告上法院,结果来了!
  5. 怎么用EDIUS让滚动字幕停下来
  6. 查看.pb文件的结构
  7. WIN10的联想小新VMcare安装Centos7虚拟机时提示“Intel VT-x处于禁用状态”有以下几种解决办法
  8. 大牛讲堂 | 语音专题第一讲,麦克风阵列的语音信号处理技术
  9. 程序员与女朋友相处之道
  10. fluent动网格profile文件的编写