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

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

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

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

d30fdfbeb312

image.png

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

d30fdfbeb312

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传入一个二维数组来隐式创建多级索引,结果如下:

d30fdfbeb312

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'])

d30fdfbeb312

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

d30fdfbeb312

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

d30fdfbeb312

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

d30fdfbeb312

image.png

swaplevel交换两层

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

d30fdfbeb312

image.png

reorder_levels调整多层顺序

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

d30fdfbeb312

image.png

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

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

d30fdfbeb312

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'})

d30fdfbeb312

image.png

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

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

d30fdfbeb312

image.png

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

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

d30fdfbeb312

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

d30fdfbeb312

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() # 将原来的三层索引压缩为一层

d30fdfbeb312

image.png

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

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

df_temp.index = new_idx

df_temp# 三层索引

d30fdfbeb312

image.png

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tensorflow 启动多个session_Tensorflow源码解析7 -- TensorFlow分布式运行时

1 概述TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时。通过分布式训练,在多台机器上并行执行,大大提高了训练速度。前端用户通过session.run()启动系统执行时,tar…

shell swt 样式_SWT之路:SWT图像显示

简明现代魔法 -> Java编程语言 -> SWT之路:SWT图像显示SWT之路:SWT图像显示2009-10-03程序演示还是先用SWT Desiner创建界面程序。然后创建一个Display对象和Image对象,和一个GC对象。类org.eclipse.swt.graphics.GC是一个封装了所有可…

xamarin和mysql_Xamarin.Android 使用 SQLiteOpenHelper 进行数据库操作

一、前言在手机中进行网络连接不仅是耗时也是耗电的,而耗电却是致命的。所以我们就需要数据库帮助我们存储离线数据,以便在用户未使用网络的情况下也可以能够使用应用的部分功能,而在需要网络连接的功能上采用提示方式,让用户决定…

python 绝对值误差小于10-6_Python 被低估了的 10 个小技巧

hi,各位朋友们,小帅b回来啦,几日不见,想我了么?今天给大家分享几个我认为不错的 Python 小技巧,有些可能被你低估了哟,get 起来!那么接下来就是:学习 Python 的正确姿势俗…

释放tcp连接的命令是_最实用的6个网络命令,网络故障不求人

很多弱电工程师朋友在项目中经常遇到一些网络故障,需要通过一些一些命令去检测、定位故障点,通过使用网络命令,故障解决的工作取得了事半功倍的效果。下面就一起温故而知新吧!一、ping命令(因特网包探索器)…

airpods2怎么查正品 ios11系统_拼多多AirPods2开箱评测,4种办法教你验真假,10个AirPods技巧教你玩...

大家好,Apple今天给大家分享一下拼多多上车AirPods 2无线充电盒版的经验,顺便整理了一波AirPods使用技巧,希望你用得上。入手理由自从去年10月份入手了iPhone XR,其实就挺想入款无线耳机的,所以一直在等AirPods升级换代…

windows文件保护_Windows系统下媲美时间机器的系统备份工具,统统免费

Windows和macOS系统谁更美?不同的人有不同的见解。但体验过macOS之后很多电脑玩家会感叹,TimeMachine时间机器太好用了,Windows下有没有同类功能呢?TimeMachine提供了全盘完整备份、增量备份、文件历史版本等功能。它们在Windows …

JAVA结课_一点心情,写java结课考试之前

突然发现,已经好久没有上来写blog了,本来还以为能够天天写,后来发现,确是心有余力而不足啊。学期进入中段,课业慢慢多了,各种各样的事情也接踵而来了。本学期的java课程也已经结课了,8周32个学时…

sql怎么撤回update_腾讯SQL“现役运动员”给你的实践小技巧

引言SQL的全称是Structured Query Language(结构化查询语言),是一种古老而简洁的程序设计语言。看似平平无奇,一直被各种吐槽,但却有着众多语言所难得的漫长寿命,并展现出极好的拓展性,在不同时期衍生出不同的子语言。…

小程序input wxss_19. 教你零基础搭建小程序:wxss-尺寸单位

这章以后的四章都是介绍小程序样式文件——wxss 的使用,分为以下三个部分一、尺寸方案二、样式导入三、选择器这章先来讲wxss的尺寸单位—— rpxwxss的定义:WXSS( WeiXin Style Sheets )是⼀套样式语言,用于描述 WXML 的组件样式。与 CSS 相比…

某一个接口403 其他接口可以调通_Neo的务实外设指南 篇三十六:一个就够,65W快充+C口混插+最多6个设备 - 飞利浦65W摩天轮插座_插座...

2020-10-26 15:29:0623点赞23收藏2评论嗨,大家好!我是沈少!之前晒雷电3扩展坞的时候,已经有小伙伴注意到我用来提供PD充电的是一个很小巧的魔方插座。也有朋友私下提醒我,这类产品虽然支持PD快充协议,但一般…

linux java 获取路径怎么写_linux中java获取路径怎么写?

linux中java获取路径怎么写?在Unix/Linux中,路径的分隔采用正斜"/",比如"cd /home/java"。在java的代码开发中 是代表转义字符。相对路径和绝对路径. 指的是当前目录.. 指的是当前目录的上一级目录./book表示当前目录下的…

layerconfirm 自动关闭问题 没有阻塞问题_微信新版本自动更新?赶紧关闭这个功能...

前不久安卓用户也迎来了微信新版本的更新不少伙伴惊呼“猝不及防,一觉醒来发现微信自动更新了”一时间还冲上了话题的热搜榜究竟是怎么肥事?小移了解到:原来是因为部分用户设置了“微信自动更新”那么问题来了,如何关闭微信自动更…

list steam_在 Steam 中国版上玩单机游戏也会受到防沉迷系统管控

今天看到一个消息,Steam 中国版,也就是所谓的“蒸汽平台”,最近正在测试。重点在于,哪怕你玩“理论上无需联网”的单机游戏,游玩时间也会受到著名的防沉迷系统的限制。以下是我在动点科技编写的新闻全文(原文链接是界面…

java的默认访问权限_java类的访问权限

1.解析Java有四种访问权限, 其中三种有访问权限修饰符,分别为private,public和protected,还有一种不带任何修饰符。private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的类、属性以及方…

github流程图_逆天插件,VSCode里也能画流程图了?Visio可以淘汰了?

vscode-drawio简介网络之大,人才百出,在开源背景下,一些功能只有你想不到,没有做不到。这不,对于写代码的程序员来说,竟然也可以在VSCode IDE里边写代码,边画逻辑流程图了。最近,在g…

spring aopalliance 包里都有什么_【九仓樱】翻包記 05 | 是什么让我的便当包里每天都带着小企鹅?!...

Sakura | 2020・05バッグ日記:< Whats in my bag ? >这里是一个全新的栏目&#xff0c;关于九仓樱の日常翻包初衷是想跟大家分享一些有趣好玩的东西想知道我到底有多少个包包吗&#xff1f;我的包包里都会有哪些你想不到的东西呢&#xff1f;LIST① MYKONOS 便当包② MY…

java setpaintmode 用法_详解Paint的各种set方法

(1) 在application配置文件中关闭硬件加速&#xff1a;android:allowBackup"true"android:hardwareAccelerated"false"android:icon"drawable/ic_launcher"android:label"string/app_name"android:theme"style/AppTheme" &g…

one more step_KDA新歌《MORE》的一些冷知识:伊芙琳换回原声,摩托车是定制的

原标题&#xff1a;KDA新歌《MORE》的一些冷知识&#xff1a;伊芙琳换回原声&#xff0c;摩托车是定制的KDA女团在2020年宣布回归后就引发了很多的关注&#xff0c;回归后也是推出了首支单曲《THE BADDEST》&#xff0c;这首歌在之后也引发了不少网友的模仿以及翻唱&#xff0c…

java jdbc连接 代码块_java 中JDBC连接数据库代码和步骤详解及实例代码

•创建一个以JDBC连接数据库的程序&#xff0c;包含7个步骤&#xff1a;1、加载JDBC驱动程序&#xff1a;在连接数据库之前&#xff0c;首先要加载想要连接的数据库的驱动到JVM(Java虚拟机)&#xff0c;这通过java.lang.Class类的静态方法forName(String className)实现。 例…