首先了解一下什么是多级索引,以及它的作用,为什么要有这个玩意。

多级索引也称为层次化索引(hierarchical indexing),是指数据在一个轴上(行或者列)拥有多个(两个以上)索引级别。之所以引入多级索引,在于它可以使用户能以低维度形式处理高维度数据。这句话可能不太好理解,下面举个栗子:

在一张二维表格中可以方便的存储两个维度的数据,比如我们现在有一张高三八班的期末考试成绩表,第一个维度行是某个学生各科的考试成绩,另一个维度列是某一科所有学生的成绩

image.png

现在在加入一个维度:不同的班级。即如果我们想在这张表上在加上高三七班同样的成绩该怎么操作?这时候我们就可以在行上在加入一个班级的维度,如下:

image.png

正常情况下,不同的班级的所有学生的成绩应该是引入不同的表格来存储,即三八班和三七班是两张表。但是引入多级索引就可以把这两张表整合在一起,即所谓的以低维度形式处理高维度的数据。 这种情况在每张表数据量不大或者字段不多的时候使用起来比较方便

1. 多级索引的创建

通常由两种方式创建多级索引:

通过多级数组隐式创建

通过pd.MultiIndex显示创建

下面分别举例

方法1-隐式创建,即给DataFrame的index或columns参数传递两个或更多的数组。

import pandas as pd

import numpy as np

from pandas import DataFrame, Series

df = DataFrame (np.random.randint ( 0 , 100 ,( 4 , 6 )),

index = ['学生' + i for i in 'ABCD'],

columns =[[ '数学' , '数学' , '语文' , '语文' , '英语' , '英语' ],

[ '期中' , '期末' , '期中' , '期末' , '期中' , '期末' ]])

df

上面通过在columns传入一个二维数组来隐式创建多级索引,结果如下:

image.png

仔细观察就可以发现上面的表格中包含学生(A/B/C/D)、科目(数学/语文)、考试阶段(期中/期末)三个维度的信息,但是是用一张二维表格来呈现。

方法二 —— 通过pd.MultiIndex显示创建

常用的有 from_tuples, from_arrays, from_product 三种方法,它们都是 pd.MultiIndex 对象下的函数。其中, from_product最简单,推荐使用。下面分别举例说明。

2.1: from_tuples指根据传入由元组组成的列表进行构造:

my_tup = [('Python', '期中'),('Python', '期末'),('Java', '期中'),('Java', '期末')]

my_index = pd.MultiIndex.from_tuples(my_tup, names = ['Obj', 'time'])

pd.DataFrame(np.random.randint(60,100, (4,3)),

index = my_index,

columns = [*'ABC'])

image.png

2.2 from_arrays指根据传入列表中,对应层的列表进行构造:

arr = [[*'ABCD'], ['a', 'b'] *2]

my_index = pd.MultiIndex.from_arrays(arr, names = ['first', 'secoond'])

col = ['China', 'US', 'UK']

val = np.random.randint(50,100, (4, 3))

df = pd.DataFrame(val, index = my_index, columns = col )

df

image.png

2.3 from_product指根据多个列表的笛卡尔积构造多级索引

mul_col = pd.MultiIndex.from_product([['Python', 'C++', 'Java'],['期中', '期末']])

df = DataFrame ( np . random . randint ( 0 , 100 ,( 6 , 4 )),

index = mul_col,

columns = list('ABCD'))

df

image.png

知识链接

笛卡尔积:令A和B是任意两个集合,若序偶的第一个成员是A的元素,第二个成员是B的元素,所有这样的序偶集合,称为集合A和B的笛卡尔乘积或直积,记做A X B

若A={a1,a2,a3……an},B = {b1,b2,b3,……bn},

则A X B = {(a1,b1), (a1,b2),....(an,bn) }, 共有n*n个元素

且每个元素中a永远在前面,b永远在后面。

例如,A={a,b}, B={0,1,2},则

A×B={(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}

B×A={(0, a), (0, b), (1, a), (1, b), (2, a), (2, b)}

总结一下多级索引MultiIndex和单极索引类似,只不过其索引中的一个元素是元组而不是单层索引中的标量。例如上面的例子中和单极索引一样我们可以使用index来查看索引。另外外层连续出现相同的值时,第一次之后出现的会被隐藏显示,使结果的可读性增强。

df.index

>>>

MultiIndex([('Python', '期中'),

('Python', '期末'),

( 'C++', '期中'),

( 'C++', '期末'),

( 'Java', '期中'),

( 'Java', '期末')],

)

2. 多级索引的常用操作

2.1 索引层的交换和删除

既然是多级索引,那么必然涉及到不同层之间的顺序调整。在pandas中索引层的交换由swaplevel和reorder_levels完成,前者只能交换两个层,而后者可以交换任意层,两者都可以指定交换的是轴是哪一个,即行索引(axis = 0)或列索引(axis = 1).为了方便举例说明,下面先创建一个多层索引的DataFrame

L1,L2,L3 = ['A','B'],['a','b'],['alpha','beta']

mul_index1 = pd.MultiIndex.from_product([L1,L2,L3], names=('Upper', 'Lower','Extra'))

L4,L5,L6 = ['C','D'],['c','d'],['cat','dog']

mul_index2 = pd.MultiIndex.from_product([L4,L5,L6], names=('Big', 'Small', 'animal'))

df_ex = pd.DataFrame(np.random.randint(-9,10,(8,8)), index=mul_index1, columns=mul_index2)

df_ex

image.png

swaplevel交换两层

df_ex.swaplevel(0,2, axis = 1) # 列索引的第一层和最后一层互换

image.png

reorder_levels调整多层顺序

df_ex.reorder_levels([2,0,1], axis = 0) # 行索引改变顺序

image.png

若想要删除某一层的索引,可以使用droplevel方法。同时删除多层,可以传入一个列表

df_ex.droplevel([0,2], axis = 0)

image.png

2.2 索引属性的修改

常用的有rename_axis和rename,其中:

rename_axis:用于修改索引层的名字,即在使用pd.MultiIndex创建时传入的names参数的值。可以传入字典进行修改

rename: 对索引的值进行修改,如果是多级索引需要指定修改的层号level:

# 修改索引层的名字

df_ex.rename_axis(index={'Extra':'Extra_change'},

columns={'animal':'animal_change'})

image.png

# ranme修改索引值,index/columns均可

df_ex.rename(index = {'alpha': 'alpha_change'}, level = 2)

image.png

对于rename,传入参数也可以是函数,其输入值就是索引元素:

df_ex.rename(columns = lambda x: str.upper(x), level=2)

image.png

另外,在修改索引时还有一个map函数比较好用。它是定义在index之上的方法。与前面rename方法中层的函数式用法是类似的,只不过它传入的不是层的标量值,而是直接传入索引的元组,这样可以对整个多级索引进行修改

例如我们将上面的索引中的小写转化为大写,且在每个索引后加上 “_change':

df_temp = df_ex.copy()

new_idx = df_temp.index.map(lambda x: (x[0]+'_change',str.upper(x[1])+'_change', str.upper(x[2])+'_change'))

df_temp.index = new_idx

df_temp

image.png

另外,map的另外一个常用的用法是用于多层索引的压缩,如下:

df_temp = df_ex.copy()

new_idx = df_temp.index.map(lambda x: (x[0]+'-'+x[1]+'-'+x[2]))

df_temp.index = new_idx

df_temp.head() # 将原来的三层索引压缩为一层

image.png

自然的,也可以反向展开:

new_idx = df_temp.index.map(lambda x:tuple(x.split('-')))

df_temp.index = new_idx

df_temp# 三层索引

image.png

好了,关于多级索引就学习这么多内容!

参考:开源内容joyful-pandas, 作者: Datawhale-耿远昊

另外,更多精彩内容也可以微信搜索,并关注公众号:‘Python数据科学家之路“ ,期待您的到来和我交流!

pandas mysql index_Pandas从入门到精通(3)- Pandas多级索引MultiIndex相关推荐

  1. 《MySQL 8从入门到精通(视频教学版)》免费送教学视频

    <MySQL 8从入门到精通(视频教学版)>京东当当天猫都有发售. 本书配套资源(源码课件教学视频)获得作者和出版社授权,文后提供清华社网盘(速度很快)的下载二维码,可用微信扫描,免费下载 ...

  2. MySQL数据库快速入门到精通(超详细保姆级,建议收藏)这可能是目前最适合你的教程,从基础语法到实例演示。

    前言 此文章旨在为需要掌握快速开发和复习MySQL的同学所准备,您完全可以把此文章当作参考文档来使用,本文将尽量精简,使您快速的理解和掌握语法. 关于MySQL MySQL是一个关系型数据库管理系统, ...

  3. MySQL存储过程从入门到精通

    文章目录 0.环境说明 1.使用说明 2.准备 3.语法 3.0 语法结构 3.1 变量及赋值 1)局部变量 2)用户变量 3)会话变量 4)全局变量 3.2 入参出参 3.3 流程控制-判断 `if ...

  4. pandas mysql主键_使用Autoincrement将Pandas Dataframe插入MySQL表自动生成主键

    我有一个Pandas数据帧,我正试图使用MySQLdb和to-sql将其插入到MySQL表中.该表的主键为'allocationid',并且为autoincrement..我希望每天都这样做,从MyS ...

  5. 《Oracle 19c从入门到精通(视频教学超值版)》简介

    #好书推荐##好书奇遇季#<Oracle 19c从入门到精通(视频教学超值版)>,京东当当天猫都有发售.本书配套源码.PPT课件.同步教学视频.380页,定价89元,网店打个折真不贵. 本 ...

  6. 快速从入门到精通!docker菜鸟教程linux

    NameServer的部署 关于NameServer,我们之前的文章已经详细讲解过了集群化的内容,这里直接把它部署到三台机器上,作为一个高可用集群 Broker的部署 Broker的部署我们之前也有讲 ...

  7. ABP从入门到精通(2):aspnet-zero-core 使用MySql数据库

    关于 asp.net zero core 项目的启动及说明,请观看我前面的博文ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明 本操作对于ABP默认项目应该也是适用的 ...

  8. mysql数据库应用_MySQL数据库应用 从入门到精通 学习笔记

    以下内容是学习<MySQL数据库应用 从入门到精通>过程中总结的一些内容提要,供以后自己复现使用. 一:数据库 查看所有数据库:SHOW DATABASES 创建数据库:CREATE DA ...

  9. mysql数据应用从入门_MYSQL数据库应用从入门到精通----读书笔记

    mysql 1.创建数据库 create database database_name; 2.查看数据库 show database_name; 3.选择数据库 use database_name; ...

最新文章

  1. 线程范围内的数据共享
  2. HBase中的时间维度
  3. dotnet安装包时找不到依赖关系_无法加载文件或程序集'Microsoft.AspNet.TelemetryCorrelation'或其依赖项之一 . 该系统找不到指定的文件...
  4. java实验33 类的继承2_java实验2 类的继承性
  5. 对于url出现jsessionid问题
  6. 如何查看jar包里的源码
  7. 计算机软考网络管理员题,2020年计算机软考网络管理员考前测试题及答案
  8. 你还在用自己的电脑跑python程序?大佬都这么玩,绝对意想不到
  9. rsyslog-mysql_04-Log rsyslog-mysql loganalyzer
  10. 一个过滤器不仅解决了会话标识未更新同时还顺带解决了已解密的登录请求
  11. 用android实现GB28181前端设备接入平台
  12. c c++ 实现代理服务器
  13. wampserver安装好后相关的设置和在不同的电脑上测试
  14. sql支持emoji表情符
  15. VBA工程加密,工程不可查看加密
  16. C语言初步-顺序结构-已知三边求三角形面积-海伦公式
  17. Groovy(Java笨狗)系列--fields and local variables
  18. Licode Demo搭建
  19. al11-添加SAP目录
  20. 颜色的整数值转换成RGB值

热门文章

  1. 一文带你了解混淆矩阵!
  2. 如何从零开始设计一颗芯片?
  3. Cloud一分钟 | 马云发表致股东的公开信;5G算什么?中国已着手研究6G相关工作...
  4. android 如何读取cgi_Python基础教程(十):CGI编程、MySQL数据库
  5. ./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such
  6. nacos集成dubbo实现远程服务调用多服务端2
  7. JAVA将ResultSet结果集遍历到List中
  8. 企业实战_13_MyCat清除冗余数据
  9. Redis 工具类_慕课版本
  10. VS Code 常规配置和一些插件 - JavaScript