Python数据分析pandas之多层高维索引
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之多层高维索引相关推荐
- Python数据分析pandas之数据拼接与连接
Python数据分析pandas之数据拼接与连接 数据拼接处理 数据拼接处理指的是numpy.pandas里对数据的拼接.连接.合并等多种方法的概称.有时我们处理的数据会分很多步骤,而中间或者最终的结 ...
- Python数据分析pandas之分组统计透视表
Python数据分析pandas之分组统计透视表 数据聚合统计 Padans里的聚合统计即是应用分组的方法对数据框进行聚合统计,常见的有min(最小).max(最大).avg(平均值).sum(求和) ...
- Python数据分析pandas之dataframe初识
Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...
- Python数据分析pandas之series初识
Python数据分析pandas之series初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上,它通 ...
- Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表
系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...
- Python数据分析pandas入门(一)------十分钟入门pandas
Python数据分析基础 一.导入常用库 二.创建对象 三.查看数据 四.选取 五.通过标签选取 六.通过位置选取 七.布尔索引 八.赋值 九.缺失值处理 十.运算与统计 十一.Apply函数的作用 ...
- Python数据分析pandas入门练习题(四)
Python数据分析基础 Preparation Exercise 1 - Filtering and Sorting Data Step 1. Import the necessary librar ...
- 【学习笔记】python数据分析-Pandas
目录 pandas数据结构 创建Series数据 创建DataFrame数据 pandas的索引操作 重新索引 更换索引 索引选取 选取行 选取列 布尔选择 pandas的增删改 增加行或列 删除行或 ...
- python数据分析-pandas学习
文章目录 一.pandas环境的搭建 1.pandas 简介 2.pandas安装和调用 二.pandas学习 1.pandas简介 2.pandas学习资源 3.pandas核心数据结构 4.Ser ...
最新文章
- win10内核linux,windows 10中发布完整的Linux内核
- python(numpy,pandas11)——pandas merge根据索引合并数据
- P1972 [SDOI2009]HH的项链
- 【工作感悟】java编程规范pdf下载
- JVM调优-GC参数
- 关于mysql单表支持的最大大小
- 【Antlr】unknown attribute text for rule stat in $stat.text
- 高中必备学习软件_10个适合高中生学习的网站amp;软件,完全免费,9科全覆盖!...
- Ubuntu为julia安装深度学习框架MXNet(支持CUDA和OPenCV编译)
- OpenStack 存储服务 Cinder介绍和控制节点部署 (十三)
- rocketmq 两个线程同时消费一个消息
- python表格数据对比_python入门之对比两份excel表格数据
- MIMO技术中的各种增益分析
- 轻松记录南极最美丽风景 有TA就已经足够
- iOS/Android 微信及浏览器中唤起本地APP
- 密码学常用网站与解密脚本
- 华为首个芯片工厂封顶!
- 长高不仅靠遗传,让孩子再次长高的秘诀都在这
- 公共计算机课的价值取向是什么意思,提问:1、新课改与新课程标准的价值取向是什么?...
- 神经网络模型结果怎么看,图像识别神经网络模型